背景交代
最近写Flutter App 时候,有一个功能是拍照片,然后照片上显示经纬度和大概地址(例如北京市海淀区)。而我们都App定位允许使用网络定位和GPS定位同时使用的。- 我司原生端使用的是高德定位:
高德定位服务包含GPS和网络定位(Wi-Fi和基站定位)两种能力。定位SDK将GPS、网络定位能力进行了封装,以三种定位模式对外开放,SDK默认选择使用高精度定位模式
- Fluterr端在App初始化时候会保存一份原生定位经纬度信息。
- 使用照片或者拍照时候,会再次调用原生定位进行一波定位,展示在照片上。
- 我司App出现的这种情况是偶发的,之前测试都正常。
出现问题描述:
近期我司其他人员在外地使用App时候出现了缩略图有经纬度信息:如下图
但是大图详情照片上有经纬度数据,但是经纬度数据的小数点位数过长,无定位地址信息:如下图
问题分析:
开始怀疑是新安装App时候,定位权限没有开,但是经过沟通,说一定开了,❌ Pass
后来想 有没有可能是不是App初始时,定位开了,然后中途无意关闭,导致拍照时候无地址?
验证:如果开始定位关闭,则缩略图上不可能有经纬度;而且大图详情也有经纬度,只是没地址,不可能拍照或选图片时候没开定位。 ❌ 也Pass百度关键字 "高德只有经纬度没有地址",结果和我情况不一样,他这是初次配置时候 key等配置没有配置好导致,我的情况是一般正常,特殊情况出现问题。需要问题再现并且分析解决。 ❌
-
后来先想解决问题后查找原因:
大图展示时候,将缩略图端地址信息(Fultter层)传递给原生层,然后三目运算(伪代码):
原生定位有地址 ?原生定位 :Fultter层传递来的地址
问题解决继续排除原因:
- 去查看高德文档
基础定位:
Android定位SDK 定位失败可能的原因:
结合实际起情况:猜测可能是网不好,于是忍受着臭气决定去厕所,那个网络奇差的地方进行测试:
1-到厕所经过多次测试,基本上每次都能展示出大图详情中的经纬度和地址信息,偶发出现的是没有经纬度没有地址,那就是没有定位出来,也不是那种有经纬度,无地址。 所以不行 ❌
2 - 然后想起来坐车过程中乘坐地铁信号也不好,于是手动增加Android高德其他参数:进行测试
将原先
//经度
map.put("longitude", aMapLocation.getLongitude());
//纬度
map.put("latitude", aMapLocation.getLatitude());
增加测试参数,修改为:
//经度
map.put("longitude", aMapLocation.getLongitude()+"+"+aMapLocation.getSpeed()+"");
//纬度
map.put("latitude", aMapLocation.getLatitude()+"+Gps"+aMapLocation.getGpsAccuracyStatus()+"+"+aMapLocation.getLocationType()+"");
在乘坐地铁过程中,正常手机能上网的时候显示书这样:
各位注意到没有:
aMapLocation.getGpsAccuracyStatus() 显示 -1; //GPS定位状态-1,未启用
aMapLocation.getLocationType() 显示6 ,或者4,有时候也会显示2(2未截图);
//说明
//aMapLocation.getLocationType()定位类型 响应码 6, 是 "基站定位结果". 具体是“纯粹依赖移动、联通、电信等移动网络定位,定位精度在500米-5000米之间。”
//aMapLocation.getLocationType() 定位类型 响应码 4, 是 “缓存定位结果” 具体是“返回一段时间前设备在同样的位置缓存下来的网络定位结果”
//aMapLocation.getLocationType() 定位类型 响应码 2, 是 “前次定位结果” 网络定位请求低于1秒、或两次定位之间设备位置变化非常小时返回,设备位移通过传感器感知。”
//此时的经纬度小数点都是6位小数点,也是我们业务所需要的,是正常显示的。
//且aMapLocation.getSpeed() 显示速度是0,说明GPS未启用
上面和下面定位类型相应码的链接 Android定位SDK定位类型对照表 响应码的说明:
遇到涵洞或者长距离相对荒芜地区时候,此时拍照就会出现:
各位注意到没有:
aMapLocation.getGpsAccuracyStatus() 显示 1; //GPS定位状态1,已启用
aMapLocation.getLocationType() 显示1;
//aMapLocation.getLocationType() 定位类型 响应码 1, 是 "GPS定位结果". 具体是“通过设备GPS定位模块返回的定位结果,精度较高,在10米-100米左右”
//此时的经纬度小数点都是超过6位小数点。
//且aMapLocation.getSpeed() 是显示速度的,说明GPS已经启用
这里说明一下为啥GPS启用后,一次显示定位的地址信息,一次不显示呢?
通过测试现象:
1> 我在拍照后立刻确定返回图片信息,此时是不显示地址的。
2> 我在拍照后,稍等一会儿,然后确定返回图片信息,此时是显示地址的。
透过现象看本质,进行分析:
1> 因为此时大前提是用GPS定位,GPS定位精准,但是耗时,立刻返回此时GPS优先返回最基础的经纬度信息,其他信息如地址还没有获取,那么此时的图片是获取不到,所以没有展示地址。
2> 因为此时大前提是用GPS定位,GPS定位精准,但是耗时,立刻返回此时GPS优先返回最基础的经纬度信息,稍等一会儿后,其他信息如地址也已经获取,那么此时确定返回,图片获取到地址信息的,所以有展示地址。
关于GPS耗时到说明,给大家看一下:
Android 定位SDK的基站定位、WiFi定位和GPS定位,它们有什么特性?
为什么Android 定位SDK获取不到定位的速度[getSpeed()]、角度[getBearing()]、海拔[getAltitude()] ?