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);
}

参考文档

  1. 官方 API 文档:LocationManager

  2. 官方 API 文档:LocationProvider

  3. 官方 API 文档: Location

  4. 官方 API 文档: Criteria

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.