前言

    之前项目中用到的定位基本是第三方的,比如高德、百度、腾讯之类。但是前段时间,第三方地图突然开启收费模式,即便是最简单的定位服务,每年也要五万块。而我的App(小透明)只用到了城市定位功能,并没有地图展示之类的,完全没有必要每年交五万块钱(主要是穷…),处于这个考虑,决定使用Android自带的定位服务来实现需要的功能。

遇到的坑

    关于动态权限之类的,在这里就不做太多的说明了,有不懂的可以私聊我。原生定位,我们基本使用的就是LocationManager,关于这块,也不做太多说明,毕竟这块的内容,网上有很多,今天主要说明的是原生定位在不同机型上面的坑。

    在实际开发中,通过locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)来获取定位的信息,信息也拿到了,然后通过获取到的经纬度,使用GeocodergetFromLocation方法获取地址列表,拿到第一条数据作为当前的定位信息,通过拿到的Address对象获取内部具体的信息。直到这里,都是没有问题的。问题出在Address中的具体信息中。Address中有多个字段,用来显示不同等级的地址信息,比如AdminArea、SubAdminArea、Locality、SubLocality、Thoroughfare、Premises等等。由于功能的需要,我这边需要获取省和市的信息,也就是获取adminArea、subAdminArea即可。按照这个思路,进行了代码的实现,在OPPO和锤子手机中是没问题的,能获取到数据

android gps原生定位 android原生定位不准_android studio


然后就欢天喜地的提交了功能,结果华为市场那边一直提示地址定位失败,自己测试怎么都没问题,很是奇怪,一直找不到问题所在。直到同事的一加手机也一直定位失败并崩溃,通过代码日志才找到问题。发现Address中的数据在某些机型下面subLocality这个字段是null的,就是这个原因才导致定位失败并崩溃的!这个很坑啊!不同机型上面返回的数据不同。。。很是无语了!而且最奇怪的是即便不为空,返回的数据也不是相同。

android gps原生定位 android原生定位不准_定位_02


这是另一台手机上返回的地址信息,subAdminArea字段在不同手机上显示的是不一致的。

解决方法

通过多台手机测试发现,可以通过subLocality这个字段来判断市这个字段应该选用哪个数据来显示。

android gps原生定位 android原生定位不准_android studio_03

结语

以上,就是我在使用Android原生定位服务中遇到的坑以及其解决方案。如果你有更好的解决方案的话,欢迎私聊,共同探讨,共同学习。
最后,打个小广告,私密树洞吐槽App小透明也上线各大应用市场,欢迎大家下载使用并提出意见!