文章来源: http://blog.sina.com.cn/s/blog_70e5bf6e0102we34.html
感谢博主 末日的回响 提供的关于百度地图在集成时所出现的Bug和解决方法,若此篇文章对您的权益有害,请联系我删除。谢谢
最近做一款平板导航工具,需要集成百度和高德地图,包括基本功能如定位、搜索等,还包括集成导航实现在APP内导航而无需跳转至其客户端。因为了解百度,所以先集成的百度。
开发环境:win7,Android Studio2.1.2,JDK1.7,Android 4.4,5.1,6.0
百度SDK使用心得:百度地图目前最新版本是地图4.0,导航3.1 ,在深入使用百度SDK后发现,其产品的更新迭代确实不如高德快,其技术支持也不如高德给力,而且百度地图接入文档有的竟显示更新日期是1年前的了,另外,百度导航SDK所提供的数据不如高德导航SDK多,百度基础地图SDK或者导航SDK单独下载时开发包所支持的平台是有多个的,而当组合下载时只有一个armeabi目录,组合下载方式应该是兼容运行的,这会引起一个问题就是你的项目如果增加了不止armeabi这个目录,估计会报错,这问题解决方式再下文中会介绍。
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction
百度集成问题:
1、发现so找不到或者编译时文件冲突,应检查所下载的SDK是否单独下载集成,需要哪些功能,应该在百度开放平台上选择组合下载方式,再集成,因为比如单独下载百度基础地图SDK,然后再下载百度导航SDK然后再同时集成进去,可能会出现两个SDK包的so文件或者jar包中有的资源冲突了,这个问题也常见,许多网友遇到了,解决方式应该是组合下载开发包再集成。
2、Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance错误可能是项目支持的平台不够,增加armeabi、armeabi-v7a、x86、x86-64、arm64-v8a等平台试试,如果不行,可尝试下文兼容问题中第2种方式
3、libBaiduMapSDK_base_v4_0_0.so" is 32-bit instead of 64-bit,这问题可见也是so文件放错平台目录了,将32位so文件放入64位平台如armeabi-v7a,x86-64目录了。如果下载的开发包中有多个平台目录,那里面的so文件一定是不同的,一定要分别复制到项目相应的平台目录下,如果组合下载SDK开发包中只有armeabi目录,那里面的so文件除非官方有说明否则都是可兼容运行的,百度目前也已支持64位机了,所以组合下载的so是可兼容运行的,但不要以为增加多个平台目录,然后将这同一个so都放入就可以,也有可能抱着错误,解决方式是按其demo只留一个armeabi目录即可,如果项目中还有其他SDK需要建立其他平台目录,也最好不要放入,这种情况比较复杂,需实际去考虑,其中也可查看下文兼容问题中第2种方式。百度支持问答:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=114745&page=1#pid238645
4、lopen("/data/data/youlain.smart.box/lib/libgnustl_shared.so", RTLD_LAZY) failed: dlopen failed: library "/data/data/youlain.smart.box/lib/libgnustl_shared.so" not found,这种问题类似上文第3点,找不到对应的so文件,可能缺少某个平台的支持,解决方式就是建立其他平台支持,如果是组合下载的SDK只有一个armeabi目录则应该只保留这个目录。百度支持问答:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=114745&page=1#pid238667
5、建议搜索结果出现空坐标点的问题,百度建议搜索的结果列表,其中竟有的结果的坐标点是空的。。。看着解决了。
6、百度地图在退出销毁时可能遇到这个问题:android.app.IntentReceiverLeaked: MainActivity has leaked IntentReceiver com.baidu.navisdk.vi.VDeviceAPI$1@27d8b76e that was originally registered here. Are you missing a call to unregisterReceiver()? 解决方法在退出时加入:VDeviceAPI.unsetNetworkChangedCallback();
7,在退出时也有可能遇到:MainActivity has leaked IntentReceiver com.baidu.navisdk.util.listener.PhoneStatusReceiver@11d4d01f that was originally registered here. Are you missing a call to unregisterReceiver()? 解决方法在退出时加入:
if(BaiduNaviManager.isNaviInited())BaiduNaviManager.getInstance().uninit();
8、百度自家SDK不能做到协调,通过百度基础地图接口规划处线路,在传入导航时竟还需要经过算路,导航开始算路传入参数是起点、终点和最多3个途经点,一共5个点,这样规划好的线路通过这5个点算路出的线路还能保证完全一样?导航SDK不能直接传入规划线路作为参数开始导航,这是个缺陷,暂时未找到比较好的方式,只能重新算路之后再导航,而且算路之后就只有一条路,不可选择。
高德SDK使用心得:高德地图目前最新版是地图3.3.2,导航1.9,高德地图更新比百度快而且其导航SDK提供了比百度更多的信息,如路况查询接口,剩余距离和时间查询接口,比较方便。高德SDK单独下载和组合下载区别同百度两种下载方式区别一样,其so文件都是兼容运行的,都只有armeabi目录,多加或者放错地方都有可能导致so文件找不到或者32位和64位机不对应,即使so可兼容运行在64位机子上。
高德集成问题:
1、高德SDK频出空指针异常。我用fragment来显示地图的,但在多次打开地图fragment又没销毁fragment的情况下,导航实例mAMapNavi= AMapNavi.getInstance(mContext);也已经跟随fragment生命周期初始化和销毁了,但经常在fragment的onDestory()方法里调用mAMapNavi.stopNavi()时报空指针异常,原因是stopNavi中有句代码调用this.api.stop();中的api是空的,isGpsReady()方法也是同样问题,此时用的高德导航版本1.8,之后咨询技术支持,估计高德也注意到了这个问题,几天后就发布了导航1.9版本,查看其代码,stopNavi()已经和上一版本完全不一样了,所以我的地图也稳定多了,这点给赞,比我咨询百度基本2天才回复的态度好多了。高德技术问答:http://lbs.amap.com/dev/ticket#/tickets
2、mAMapNavi= AMapNavi.getInstance(mContext);初始化失败mAMapNavi为null的问题,原因是so找不到或者放错地方,高德基础地图和导航SDK单独下载和组合下载的区别同百度,所以这个解决方式和百度类似。
3、不能截图。高德基础地图提供了截图接口,可以截图,但使用其导航SDK时因为导航view是3D视图,不存在view的缓存中所以不能通过获取view的缓存图来截图,必须调用系统截图功能,将整个屏保存下来,截图代码需要就自行百度了。
4、高德导航是单例模式,如果在规划一次导航之后不调用停止导航再次启动时可能还会保留有上次导航的缓存数据。
5、高德导航连续算路第3次之后一定失败,失败回调错误code一直报2,查资料2是网络连接超时。开始一直以为是连续算路并进入导航过程资源未释放干净,原来是算路时传入的起点和终点列表一直用的同一对象并且为清空列表导致之后的算路传入的起始点经纬度其实都按第一次算路的参数来,因为起点和终点都是一个列表传入多个相隔太远的经纬坐标就会导致多次之后计算失败,但至于为啥报这个网络错误,估计SDK的问题了
高德百度同时集成兼容问题:
1、资源冲突问题,高德与百度jar包中有名字相同资源文件,这问题也有网友遇到过,因项目时间问题,目前我的解决方式也是简单粗暴,因为偏好高德,而且估计百度也用不到冲突资源所涉及的功能,所以直接将百度jar包中的冲突图片直接改名,这样就可以编译通过了,若以后寻到更好办法,再来更新此文。
2、多方SDK支持的CPU架构冲突问题。除了高德百度,我的项目还用到了科大讯飞,而科大讯飞需要支持如下平台arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64,至于各个目录对应什么平台就不解释了,我也解释不清,百度好了,注意x86_64的确是下划线,和armeabi-v7a不一样,此时如果项目建这么多文件夹,而百度高德组合下载的SDK都是只有armeabi的,如果将这两地图的so都复制一份到所有平台目录,则会出上文百度第3个问题,如果地图so文件只放armeabi目录而其他目录不放,则可能会报找不到so错误,这点困扰很久,最终解决方式是新建一个类库library,将科大讯飞jar包和so文件都放入类库中,他的so文件也在这个类库中,然后自己项目引用这个类库,自己项目只保留armeabi这个目录,并且在build.gralde文件的defaultConfig中加入如下代码:
ndk {
abiFilters"armeabi"//输出指定三种abi体系结构下的so库,目前可有可无。
}
不然android studio 会从引用类库中各个平台目录下去寻找对应的so文件,这个就会出现上文中一些错误,通过这种方式去解决暂时未发现会造成科大讯飞错误,也未再陆续出现上文中地图那些so错误,原来只在华为4.4荣耀4C手机上能同时运营高德和百度,用5.0以上手机就会百度崩溃,高德崩溃,但现在通过这种方式都已经解决了,以后可能遇到的未知问题就兵来将挡水来土掩了。