初探Android平台上的定位服务(GPS)
特别声明:以下所有操作都别忘记了加上权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
LocationManager
通过LocationManager可以实现设备的定位、跟踪和趋近提示。它不需要你直接来实例化,我们可以通过Context.getSystemService(Context.LOCATION_SERVICE). 来获得LocationManager实例。
常用属性和方法
属性和方法 |
描述 |
GPS_PROVIDER |
静态字符串常量,表明LocationProvider是GPS |
NETWORK_PROVIDER |
静态字符串常量,表明LocationProvider是网络 |
addGpsStatusListener(GpsStatus.Listener listener) |
添加一个GPS状态监听器 |
addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent) |
添加一个趋近警告 |
getAllProviders() |
获得所有的LocationProvider列表 |
getBestProvider(Criteria criteria, boolean enabledOnly) |
根据Criteria返回最适合的LocationProvider |
getLastKnownLocation(String provider) |
根据Provider获得位置信息 |
getProvider(String name) |
获得指定名称的LocationProvider |
getProvider(boolean enableOnly) |
获得可利用的LocationProvider列表 |
removeProximityAlert(PendingIntent intent) |
删除趋近警告 |
requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent) |
通过给定的Provider名称,周期性地通知当前Activity |
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) |
通过给定的Provider名称,并将其绑定指定的LocationListener监听器 |
|
|
LocationProvider
LocationProvider用来描述位置提供者,设置位置提供者的一些属性。可以通过Criteria类来为LocationProvider设置条件,获得合适的LocationProvider。
属性或者方法名称 |
描述 |
AVAILABLE |
静态整型常量,标示是否可利用 |
OUT_OF_SERVICE |
静态整型常量,不在服务区 |
TEMPORAILY_UNAVAILABLE |
静态整型常量,临时不可利用 |
getAccuarcy() |
获得精度 |
getName() |
获得名称 |
getPowerRequirement() |
获得电源需求 |
hasMonetaryCost() |
花钱的还是免费的 |
requiresCell() |
是否需要访问基站网络 |
requiresNetWork() |
是否需要Intent网络数据 |
requiresSatelite() |
是否需要访问卫星 |
supportsAltitude() |
是否能够提供高度信息 |
supportsBearing() |
是否能够提供方向信息 |
supportsSpeed() |
是否能够提供速度信息 |
实例:获取设备上的所有的LocationProviders
locationManager=(LocationManager)LocationManagerDemoActivity.this.getSystemService(Context.LOCATION_SERVICE); //获取所有的LocationProvider List<String> allproviders=locationManager.getAllProviders(); for (String string : allproviders) { System.out.println(string); }
Location类
它用于描述当前设备的地理位置信息,包括了经纬度、方向、高度和速度等。可以通过LocationManager.getLastKnownLocation(String provider)方法可以获得Location实例
其常见方法和属性:
方法 |
描述 |
public float getAccuracy () |
获得精确度 |
public double getAltitude () |
获得高度 |
public float getBearing () |
获得方向 |
public double getLatitude () |
获取经度 |
public double getLongitude () |
获得纬度 |
public float getSpeed () |
获得速度 |
实例:得到你自己的位置
// 获取自己的位置 btnGetPosition.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println("获取当前位置"); locationManager = (LocationManager) LocationManagerDemoActivity.this .getSystemService(Context.LOCATION_SERVICE); Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); System.out.println("你当前的位置:"); StringBuilder sb=new StringBuilder("你当前的位置(经纬度):"); sb.append("("); sb.append(location.getLatitude()); sb.append(","); sb.append(location.getLongitude()); sb.append(")"); System.out.println(location.getLatitude()); System.out.println(location.getLongitude()); txtPostion.setText(sb); } });
实例:追踪位置:
requestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener)
关于参数minTime,minDistance的说明是指当用户位置改变多少纬度时候多长时间更新下这个用户的位置
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 500, 500, new listener());
实例:获取最好的LocationProivider
LocationManager.getBasetProvider(Criteria criteria,boolean is)
Criteria类
它封装了用于获得LocationProvider的条件,可以根据指定的Criteria条件来过滤获得LocationProvider
及常用属性和方法如下:
属性或访求名称 |
描述 |
ACCERACY_COARSE |
粗糙精确度 |
ACCURACY_FINE |
较高精确度 |
POWER_HING |
用电高 |
POWER_LOW |
用电低 |
isAlititudeRequried() |
返回Provider是否需要高度信息 |
isBearingRequired() |
返回Provider是否需要方位信息 |
isSpeedRequried() |
返回Provider是否需要速度信息 |
isCostAllowed() |
是否允许产生费用 |
setAccuracy(int accuracy) |
设置Provider的精确度 |
setAltitudeRequired (boolean altitudeRequired) |
设置Provider是否需要高度信息 |
setBearingRequired (boolean bearingRequired) |
设置Provider是否需要方位信息 |
setCostAllowed (boolean costAllowed) |
设置Provider是否产生费用 |
setSpeedAccuracy (int accuracy) |
设置Provider是否需要速度信息 |
getAccuracy() |
获得精度 |
// 获取最佳的Provider btnBestProvider.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String bestProviders = ""; locationManager = (LocationManager) LocationManagerDemoActivity.this .getSystemService(Context.LOCATION_SERVICE); // 新建一个Criteria Criteria criteria = new Criteria(); // 设置精确度 criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setCostAllowed(false); // 获得符合条件的provider bestProviders = locationManager .getBestProvider(criteria, false); txtCrerita.setText("最佳的provider:"+bestProviders); } });
总结(再看GPS):
从以上知识我们可以知道,要想使用Android平台下的GPS服务我们就得用LocationManager这个系统服务,我们可以通过Context.getSystemService(Context.LOCATION_SERVIER)来得到这个LocationManager对象实例,有了这么一个服务后,我们可以通过LocationProvider来描述位置提供者,为了某种需要我们又用到了一个Criteria类来设置满足我们自己的最佳要求,那么这一切都搞定的时候,获取我们自己所在的位置我们就用到了Location类,这个类用来获取我们自己的位置,例如:经纬度。