前段时间Flutter集成高德的导航功能的时候,开始是使用的插件flutter_amap_plugin,但是发现它的高德sdk版本有点低,而且没有实现输入起始点坐标导航的功能。其它的诸如 如果是自己添加上去,由于它sdk版本比较低,现有的文档已经找不到那个版本的sdk的接口是什么,所以决定自己手动写个导航的插件flutter_navi_plugin。
由于使用了amap_map_fluttify这个地图插件,它包含了高德地图功能,里面包含了Android_Map3D_SDK_V6.9.2_20190709.jar(下文简称"6.9.jar")包这个库。在写导航插件的时候我在高德官方下载了导航的sdk是AMap3DMap_7.2.1_AMapNavi_7.2.0_20200115.jar(下文简称"7.2.jar")这个jar包,这个jar包包含了地图和定位。这个时候如果同时引用这两个插件的话会引起多定义冲突,因为其实后者包含了前者。
开始我想的办法是希望能够屏蔽掉7.2.jar里跟6.9里jar相同的包名,网上查了后说的是使用exclude group屏蔽掉相关联的模块,需要放在App住Module里的build.gradle里,像下面这样:
dependencies {
compile (project(':Speech')){
//解决Gson重复依赖问题,与passport-1.4.2.jar有冲突
exclude group: 'com.google.code.gson', module: 'gson'
}
}
额,试过这种方式,考虑到需要过滤的jar包内容较多,就使用了下面的方式
解决方法
我还是决定使用7.2.jar这个jar包,然后让amap_map_fluttify依赖flutter_navi_plugin,当然amap里要取消掉对6.9.jar的引用。当然,6.9和7.2的api有些许不同,不过所幸两者版本相差不大。但是一开始我用这种方式amap_map_fluttify始终无法连接到flutter_navi_plugin里的jar包的相关类,经过一段时间后找到原因是由于我对包的引用使用的是compile的引用方式,即compile files('xxx.jar'),这种引用方式外部无法使用,正确的方式是api files('xxx.jar')。
compile files('xxx.jar')
//改为
api files('xxx.jar')
由于两个版本的api还是有些许差异,amap_map_fluttify本来实现了很多插件方法,总共有差不多1w多行代码,所以需要改动的地方也很多,不过由于我只用到了地图相关功能,只需改动地图相关的方法其他注释就可。
网友评论