Android GPS (全球定位)
Android 中定位的方式一般有这四种:GPS 定位,WIFI 定准,基站定位,AGPS 定位(基站+GPS)
GPS 是通过与卫星交互来获取设备当前的经纬度,准确度较高,但也有一些缺点,最大的缺点就是: 室内几乎无法使用
因为需要收到 4 颗卫星或以上信号才能保证 GPS 的准确定位,但是假如你是在室外,无网络的情况,GPS 还是可以用的
GPS 定位权限
使用 GPS 定位需要添加权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
GPS 定位相关的一些 API
1. LocationManager
LocationManager 是系统服务,不能直接 new,需要
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
有了 LocationManager 对象后,就可以调用下面这些常用的方法
方法 | 说明 |
---|---|
addGpsStatusListener(GpsStatus.Listener listener) | 添加一个 GPS 状态监听器 |
addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent) | 添加一个临界警告 |
getAllProviders() | 获取所有的LocationProvider列表 |
getBestProvider(Criteria criteria, boolean enabledOnly) | 根据指定条件返回最优 LocationProvider |
getGpsStatus(GpsStatus status) | 获取 GPS 状态 |
getLastKnownLocation(String provider) | 根据 LocationProvider 获得最近一次已知的 Location |
getProvider(String name) | 根据名称来获得 LocationProvider |
getProviders(boolean enabledOnly) | 获取所有可用的LocationProvider |
getProviders(Criteria criteria, boolean enabledOnly) | 根据指定条件获取满足条件的所有LocationProvider |
isProviderEnabled(String provider) | 判断指定名称的 LocationProvider 是否可用 |
removeGpsStatusListener(GpsStatus.Listener listener) | 删除 GPS 状态监听器 |
removeProximityAlert(PendingIntent intent) | 删除一个临近警告 |
requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent) | 通过制定的 LocationProvider 周期性地获取定位信息,并通过 Intent 启动相应的组件 |
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) | 通过制定的 LocationProvider 周期性地获取定位信息,并触发 listener 所对应的触发器 |
LocationProvider (定位提供者)
LocationProvider 是 GPS 定位组件的抽象表示,调用下述方法可以获取该定位组件的相关信息
方法 | 说明 |
---|---|
getAccuracy() | 返回 LocationProvider 精度 |
getName() | 返回 LocationProvider 名称 |
getPowerRequirement() | 获取 LocationProvider 的电源需求 |
hasMonetaryCost() | 返回该 LocationProvider 是收费还是免费的 |
meetsCriteria(Criteria criteria) | 判断 LocationProvider 是否满足 Criteria 条件 |
requiresCell() | 判断 LocationProvider 是否需要访问网络基站 |
requiresNetwork() | 判断 LocationProvider 是否需要访问网络数据 |
requiresSatellite() | 判断 LocationProvider 是否需要访问基于卫星的定位系统 |
supportsAltitude() | 判断 LocationProvider 是否支持高度信息 |
supportsBearing() | 判断 LocationProvider 是否支持方向信息 |
supportsSpeed() | 判断是 LocationProvider 否支持速度信息 |
Location ( 位置信息 )
Location 是位置信息的抽象类,我们可以调用下述方法获取相关的定位信息
方法 | 说明 |
---|---|
float getAccuracy() | 获得定位信息的精度 |
double getAltitude() | 获得定位信息的高度 |
float getBearing() | 获得定位信息的方向 |
double getLatitude() | 获得定位信息的纬度 |
double getLongitude() | 获得定位信息的精度 |
String getProvider() | 获得提供该定位信息的 LocationProvider |
float getSpeed() | 获得定位信息的速度 |
boolean hasAccuracy() | 判断该定位信息是否含有精度信息 |
Criteria ( 过滤条件 )
获取 LocationProvider 时,可以设置过滤条件,就是通过这个类来设置相关条件
方法 | 说明 |
---|---|
setAccuracy(int accuracy) | 设置对的精度要求 |
setAltitudeRequired(boolean altitudeRequired) | 设置是否要求 LocationProvider 能提供高度的信息 |
setBearingRequired(boolean bearingRequired) | 设置是否要 LocationProvider 求能提供方向信息 |
setCostAllowed(boolean costAllowed) | 设置是否要求 LocationProvider 能提供方向信息 |
setPowerRequirement(int level) | 设置要求 LocationProvider 的耗电量 |
setSpeedRequired(boolean speedRequired) | 设置是否要求 LocationProvider能提供速度信息 |
判断 GPS 是否打开以及打开 GPS 的两种方式
使用 GPS 定位前的第一件事应该是去判断 GPS 是否已经打开或可用
没打开的话我们要提醒用户打开 GPS
判断 GPS 是否可用
// 如果没权限,打开设置页面让用户自己设置 if ( checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 不可用的情况... }
检测到 GPS 未打开,打开 GPS
打开 GPS 位置信息设置页面,让用户自行打开
// 如果没权限,打开设置页面让用户自己设置 if ( checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, 0); }