https://lbsyun.baidu.com/index.php?title=androidsdk
https://lbsyun.baidu.com/index.php?title=android-locsdk
在官方api上没看到有相关说明,这里记录一下。
本文百度sdk版本:
BaiduMapSDK_Location_All:9.3.7 全量定位组件
BaiduMapSDK_Map:7.5.4 地图组件
1.BaiduMap配置
有时setMaxAndMinZoomLevel出现无效的情况,发现是代码顺序的问题。
1 2 |
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); // 地图类型:MAP_TYPE_NORMAL普通地图,MAP_TYPE_SATELLITE卫星地图模式 baiduMap.setMaxAndMinZoomLevel(20.0f, 17.0f); // 限制地图的缩放级别。【放在setMapType之后,否则无效】 |
根据工单描述,官方就是这样设计的。
2.首次定位绘制折线崩溃
有个全局的覆盖物集合,用于存储已经显示过的覆盖物。
private List<Overlay> lastOverlayList = new ArrayList<>();
存储在地图上显示的Polygon、Polyline、List<Marker>。
进入界面后,在定位监听器BDAbstractLocationListener的onReceiveLocation(BDLocation location)回调中,根据需要创建3种样式的覆盖物。
1 2 3 4 5 6 7 8 |
这是创建封闭图形drawPolygons(){ PolygonOptions options = new PolygonOptions() // .fillColor(0xAAFFFF00) // .stroke(new Stroke(5, 0xAA00FF00)); options.points(trace.getBaiduLatLngs()); Polygon pg = (Polygon) baiduMap.addOverlay(options);// 多边形 lastOverlayList.add(pg); } |
1 2 3 4 5 6 7 8 |
这是创建连续线段-折线drawPolylines(){ PolylineOptions options = new PolylineOptions() // .color(0xAAFF0000) // 线条颜色 .width(10); // 线条宽度 options.points(trace.getBaiduLatLngs()); Polyline pl = (Polyline) baiduMap.addOverlay(options); // 折线 lastOverlayList.add(pl); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
这是创建标记物drawMarks(){ List<OverlayOptions> oos = new ArrayList<>(); ArrayList<Picture> pictures = trace.getPictures(); for (int i = 0; i < pictures.size(); i++) { Picture pic = pictures.get(i); double latitude = pic.getLatitude(); double longitude = pic.getLongitude(); LatLng point = new LatLng(latitude, longitude); OverlayOptions option = new MarkerOptions() // .position(point) // // .scaleX(2) // // .scaleY(2) // .icon(markDesc); oos.add(option); } List<Marker> markers = baiduMap.addOverlays(oos);// Markers lastOverlayList.addAll(markers); } |
同时,创建三种覆盖物之前,都先执行清除已有的覆盖物。
1 2 3 4 5 6 7 8 |
drawXxxs(){ if (lastOverlayList.size() > 0) { // 移除上一次绘制的覆盖物 baiduMap.removeOverLays(lastOverlayList); } baiduMap.clear(); // 绘制某种覆盖物 } |
遇到的情况是,如果首次定位回调,创建的是折线Polyline,就会崩溃。指向的代码是“baiduMap.removeOverLays(lastOverlayList) ”,日志示样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: can't call android.os.Bundle android.os.Bundle.getBundle(java.lang.String) on null object 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] in call to CallObjectMethodV 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] from void com.baidu.platform.comjni.map.basemap.NABaseMap.nativeRemoveOneOverlayItem(long, android.os.Bundle) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] "pool-4-thread-1" prio=5 tid=30 Runnable 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] | group="main" sCount=0 dsCount=0 flags=0 obj=0x13900460 self=0x787c3f9c00 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] | sysTid=32106 nice=0 cgrp=default sched=0/0 handle=0x78781574f0 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] | state=R schedstat=( 20010206 37801668 46 ) utm=2 stm=0 core=0 HZ=100 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] | stack=0x7878054000-0x7878056000 stackSize=1041KB 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] | held mutexes= "mutator lock"(shared held) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] native: #00 pc 00000000003c27b0 /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+220) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] native: #01 pc 000000000049027c /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+352) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at com.baidu.platform.comjni.map.basemap.NABaseMap.nativeRemoveOneOverlayItem(Native method) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at com.baidu.platform.comjni.map.basemap.NABaseMap$f.run(NABaseMap.java:12) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at java.util.concurrent.FutureTask.run(FutureTask.java:266) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] at java.lang.Thread.run(Thread.java:764) 时间/com.baidu.baidulocationdemo A/idulocationdem: java_vm_ext.cc:542] 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] Runtime aborting... 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] Dumping all threads without appropriate locks held: thread list lock mutator lock 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] All threads: 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] DALVIK THREADS (32): 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] "Jit thread pool worker thread 0" prio=5 tid=2 Runnable 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] | group="" sCount=0 dsCount=0 flags=0 obj=0x12f00000 self=0x789080e000 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] | sysTid=31962 nice=9 cgrp=default sched=0/0 handle=0x78907ad4f0 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] | state=R schedstat=( 965090818 300019486 1073 ) utm=80 stm=16 core=4 HZ=100 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] | stack=0x78906af000-0x78906b1000 stackSize=1021KB 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] | held mutexes= "mutator lock"(shared held) 时间/com.baidu.baidulocationdemo A/idulocationdem: runtime.cc:558] native: #00 pc 00000000003c27b0 /system/lib64/libart.so (art::DumpNativeStack |
提交工单,回复问我使用的是“哪个版本”,“具体是如何使用的”,这个在创建工单时都有说明;还让我代码截图一下,截图得好几个类好几张,还得做说明,算了吧。
测试多次,只在进入界面定位后首次绘制的是Polyline才发生。解决的办法比较低级,先绘制一个Marker。
1 2 3 4 5 6 7 8 |
if (isFirstLinePart) { // 若进入界面就绘"线",会出现so异常退出。先绘制"点",则无异常。未查明 isFirstLinePart = false; List<Overlay> overlayList = drawMarks(trace); lastOverlayList.addAll(overlayList); } else { Overlay overlay = drawLine(trace); // 绘制当前线路轨迹 lastOverlayList.add(overlay); } |
3.部分手机地图灰色不显示
测试机是华为P10,VTR-AL00,鸿蒙2.0。这个手机的GPS只有一个开关选项,没有低精度、高精度等选项。
联网,开了GPS的情况下,有时地图显示是格子,有时是灰色,放大有字样“此区域无卫星图”。日志返回定位“4.9E -324”。
在华为nova9、小米上测试都无问题,可正常显示。
签名文件sha1、appid、动态申请权限等排除。最后发现还是缺少权限注册了。以下4个要齐全。
1 2 3 4 5 6 7 8 9 |
<!-- 【如果定位返回4.9E -324,地图灰色"此区域无卫星图",尝试加'xxx-xxx-STATE'字样的权限】 --> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> |
- end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/4209.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设