近期华为开发者论坛有收到开发者发问:我的利用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/…
原作者:胡椒