解决Android原生定位的坑
android原生定位的代码网上已经很多了,就不贴出来。
简单了解下:
gps_provider:
通过手机内置的gps芯片,利用卫星获取定位信息。位置监听、卫星状态监听很耗电且室内定位很不准确。
network_provider:
网络定位通过基站和wifi节点,利用节点id在定位数据服务器查询位置信息。但是国内网络不允许,且有消息称google已不提供该服务。so网上出现的此种方式获取定位信息不可用,也就是说network_provider在国内不可用。
passive_provider:
被动定位,其他应用比如百度、高德等使用了定位,系统会更新定位信息并保存下来,通过此方式可以获取最近一次的位置信息。
第三方sdk当然好用了,但是要注意获取的经纬度是经过了偏移的,只适配自己的地图。比如用百度地图sdk获取的经纬度在百度地图上是准确的,在高德地图上显示可能就会有一定的偏差。如果经纬度和地图不是成套使用就要考虑偏移的情况,而不是获取的经纬度不准确。第三方sdk都有自己的网络定位数据,他们的网络定位不仅仅是依靠服务器查询,还有一套算法支撑,所以室内定位比较准确。
有些项目不使用第三方sdk,只能用原生方法获取定位。network_provider *放弃,passive_provider 只能是辅助,gps_provider 需要增加精度。
我是这么处理的:
1. addgpsstatuslistener 监听卫星状态,当信号值 > 1 的卫星数量在4颗以上,才可以使用 gps_provider;
2. 速度>0.5 且 精度 < 50 才会被认为是有效的经纬度数据(我的项目中设备是移动的)。
补充:使用android自带api定位失败的原因
前奏:使用高德百度等定位,集成那么麻烦。为何不使用android自带的api进行定位。省时省力?
1.使用自带定位很简单,如下图
2.继承locationlistener
3.如果获取到就解析数据
但是,问题来了。
位置提供者就两种方式,要么network,要么gps.
问题:
1.使用gps,收不到任何回调。
2.使用network,一直回调onproviderdisabled
原因:那就是当你在室内开发时,你的手机根本就没法获取位置信息,你叫系统如何将位置信息通知给你的程序。
所以要从根本上解决这个问题,就要解决位置信息获取问题。
刚刚也提到了,只有network_provider这种模式才是室内定位可靠的方式,只不过由于大陆的怪怪网络,且大部分厂商也不会用google的服务,这种定位方式默认是没法用的。
那怎么办?好办,找个替代的服务商就可以了,百度的位置信息sdk就可以解决这个问题。
它的基本原理在上面已经提到过了,就是搜集你的wifi节点信息和你的手机基站信息来定位。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
下一篇: 再见了!虾米音乐今日正式关停
推荐阅读
-
Android集成阿里百川电商SDK踩过的坑总结
-
Centos7安装docker compse踩过的坑及解决方法
-
解决Android SearchView不显示搜索icon的问题
-
Android8.1原生系统网络感叹号消除的方法
-
Android修改源码解决Alertdialog触摸对话框边缘消失的问题
-
Android Studio 运行时出现的警告信息解决办法
-
Android中自定义的dialog中的EditText无法弹出输入法解决方案
-
Android中使用LayoutInflater要注意的一些坑
-
Android view更改背景资源与padding消失的问题解决办法
-
Vue中android4.4不兼容问题的解决方法