ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-17 10:51:41  阅读:219  来源: 互联网

标签:定位 调用 位置 接口 new 权限 准确 GPS


近期华为开发者论坛有收到开发者提问:我的应用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/consumer/cn/hms/huawei-locationkit?ha_source=hms1

定位服务开发指南:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/location-develop-steps-0000001050746143-V5?ha_source=hms1

示例代码:https://github.com/HMS-Core/hms-location-demo

原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0202524842524900621?fid=18

原作者:胡椒

标签:定位,调用,位置,接口,new,权限,准确,GPS
来源: https://blog.51cto.com/u_14772288/2713008

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有