• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

我的应用所需权限都已全部打开定位数据依然不准确

android 搞代码 3年前 (2022-03-01) 29次浏览 已收录 0个评论

近期华为开发者论坛有收到开发者发问:我的利用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);
  1. 定义地位更新回调。
LocationCallback 
mLocationCallback
;        
mLocationCallback
= new LocationCallback() {        
   @Override
   public void onLocationResult(LocationResult 
locationResult
) {        
       if (
locationResult
!= null) {        
           // 解决地位回调后果        
       }        
   }        
};
  1. 调用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) {        
           // 接口调用失败的解决        
        }        
    });
  1. 调用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/&#8230;

定位服务开发指南:https://developer.huawei.com/…

示例代码:https://github.com/HMS-Core/h…

原文链接:https://developer.huawei.com/…
原作者:胡椒


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:我的应用所需权限都已全部打开定位数据依然不准确

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址