近期华为开发者论坛有收到开发者发问:我的利用 app 须要调用 GPS 的位置服务,曾经将利用所须要的所有权限全副关上,而且应用了 wifi 和 4G 网络,手机的耗电治理和联网治理等设置也全副为 app 凋谢,但应用规范 Android 接口调用的 GPS 地位和速度数据仍然十分不精确,怎么解决呢?问题链接
Android 原生定位优缺点剖析
发问的开发者在利用中调用的是 Android 原生的接口进行定位。
Android 原生定位提供 GPS 定位和网络定位两种模式。GPS 定位反对离线定位,依附卫星,没有网络也能定位,精度高,但功耗大,因须要开启挪动设施中的 GPS 定位模块,会耗费较多电量;收集卫星、计算数据工作比拟耗时,通常导致首次定位较慢;且因为须要接管卫星信号,易受环境、地理位置影响,即信号的接管容易受天气,以及修建等遮挡物的影响,隧道、山区等地信号通常较差,巍峨的建筑物、密集的楼房、屋顶、墙壁,都会影响 GPS 接管信号导致定位不准。
Network 定位(网络定位),定位速度快,只有具备网络或者基站要求,在任何中央都可实现霎时定位,室内同样满足;功耗小,耗电量小;但定位精度差,容易受烦扰,在基站或者 WiFi 数量少、信号弱的中央定位品质较差,或者无奈定位;必须连贯网络能力实现定位。
上述的两种定位模式都有各自的优缺点,发问的开发者在利用中调用 Android 原生的接口进行定位,传统的 GPS 定位精度只有 3 - 7 米,而我国城市主干道繁多车道宽个别是 3.75 米,也就是说 GPS 无奈做到车道线级定位。尤其在城市道路或峡谷中,精度会进一步降落。
那么除了调用原生的接口获取定位以外,还有其余解决办法吗?
华为定位服务
华为定位服务(Location Kit)是华为为开发者提供的一项定位能力。采纳卫星导航系统(Global Navigation Satellite System,简称 GNSS)、Wi-Fi、基站等多路径的混合定位模式进行定位,利用可疾速、精准地获取用户地位信息。
以后华为定位服务提供的次要能力蕴含三个局部:交融定位、流动辨认和天文围栏。开发者能够依据本人的需要,调用相应的能力。
其中流动辨认性能通过加速度传感器、蜂窝网络信息、磁力计辨认用户静止状态,便于通过理解用户行为来调整利用。天文围栏性能能够通过 API 设置感兴趣的地位区域,在指定操作(如来到、进入、驻留)产生时,手机即可及时收到一个告诉。交融定位性能联合 GNSS、Wi-Fi 和基站地位数据,提供一套简略易用的 API,能够更不便疾速获取设施地位信息,实现精准定位。
交融定位:基于多用途的交融定位,实现精准定位
随着 5G 通信技术的发展,交融定位技术交融了目前市面上的所有定位形式,包含 GNSS、Wifi 定位、基站定位、蓝牙定位以及传感器定位,堪称定位技术集大成者。
GNSS 在首次定位时,因为要从新获取星历信息,搜星后能力进行定位。当 GNSS 信号弱时,能够疾速进行辅助定位,减少定位成功率,实现精准定位。且能够依据手机的电量去抉择适合的定位形式,在手机电量低时,防止 GNSS 定位产生功耗。
如何继续获取地位信息?
如果心愿利用能够继续获取设施地位,能够应用定位服务提供的 requestLocationUpdates()
接口。该接口依据入参模式的不同,将以两种不同的模式将地位信息返回。一种是通过调用曾经定义的 LocationCallback
类中 onLocationResult()
回调办法返回一个蕴含地位信息的 LocationResult
对象,另一种是将地位信息置于 PendingIntent 扩大信息中返回。
当应用程序不再须要接管地位更新时,该当进行地位更新,以便于降低功耗。要进行地位更新,能够调用 removeLocationUpdates()
,传入与requestLocationUpdates()
接口绝对应的 LocationCallback
或 PendingIntent 对象。这里以回调形式作为样例,代码如下。具体的参数阐明请参见 LocationService
接口阐明。
1. 设置继续定位申请参数。
LocationRequest
mLocationRequest
= new LocationRequest();
// 设置地位更新的距离(单位为毫秒)mLocationRequest
.setInterval(10000);
// 设置定位类型
mLocationRequest
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
- 定义地位更新回调。
LocationCallback
mLocationCallback
;
mLocationCallback
= new LocationCallback() {
@Override
public void onLocationResult(LocationResult
locationResult
) {
if (
locationResult
!= null) {// 解决地位回调后果}
}
};
- 调用 requestLocationUpdates()进行继续定位。
fusedLocationProviderClient
.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {// 接口调用胜利的解决}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {// 接口调用失败的解决}
});
- 调用 removeLocationUpdates()进行地位更新。
// 留神:进行地位更新时,mLocationCallback 必须与 requestLocationUpdates 办法中的 LocationCallback 参数为同一对象。fusedLocationProviderClient.removeLocationUpdates(mLocationCallback)
// 进行地位更新胜利监听回调
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {// ...}
})
// 进行地位更新失败监听回调
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {// ...}
});
欲了解更多详情,请参阅:
华为定位服务官网:https://developer.huawei.com/…
定位服务开发指南:https://developer.huawei.com/…
示例代码:https://github.com/HMS-Core/h…
原文链接:https://developer.huawei.com/…
原作者:胡椒