说说使用腾讯地图sdk遇到的那些坑

前言

之前做项目一直使用的高德地图,这次做的项目客户必须使用腾讯地图,然后又去折腾了下腾讯地图,说说我遇到的哪些bug

Bug1:使用RxJava集成sdk报错

由于先Rxjava比较火,为了赶上时代的脚步,现在做的这几个项目都用的是Rxjava,但是当我导入腾讯地图sdk后,却报了这个错

1
2
3
4
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
File1: E:\Android Project\YiBangKe\app\libs\TencentMapSDK_Vector_v3.0.4.jar
File2: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.1\b494968f6050d494de55dc3ce005e59c7eb40012\rxjava-1.1.1.jar

报错原因应该是因为腾讯地图也加入了RxJava

解决办法

在app的build.gradle下面加入

1
2
3
4
5
android {
packagingOptions {
exclude 'META-INF/rxjava.properties'
}
}

Bug2:getMap()空指针

使用地图官方建议是使用的SupportMapFragment,于是乎按照官方demo代码写下来

1
2
3
4
5
6
FragmentManager fm = getSupportFragmentManager();
SupportMapFragment map = (SupportMapFragment)fm.findFragmentById(R.id.frag_map);
tencentMap = map.getMap();
tencentMap.moveCamera(CameraUpdateFactory.newCameraPosition(new
CameraPosition(new LatLng(34.611524,105.058565), 3, 0, 0)));
tencentMap.getUiSettings().setZoomControlsEnabled(false);

这个是布局

1
2
3
4
5
<fragment
android:id="@+id/frag_map"
class="com.tencent.tencentmap.mapsdk.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

然后运行后报了下面这个错误

1
2
3
4
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.tencent.tencentmap.mapsdk.maps.TencentMap com.tencent.tencentmap.mapsdk.maps.MapView.getMap()' on a null object reference
09-28 17:46:03.824 10311-10311/com.baishan.yibangke W/System.err: at com.tencent.tencentmap.mapsdk.maps.SupportMapFragment.getMap(SupportMapFragment.java:65)
09-28 17:46:03.824 10311-10311/com.baishan.yibangke W/System.err: at com.baishan.yibangke.presenter.MainPresenter.initMap(MainPresenter.java:47)
09-28 17:46:03.824 10311-10311/com.baishan.yibangke W/System.err: at com.baishan.yibangke.ui.fragment.MainFragment.processLogic(MainFragment.java:74)

MapView.getMap()是个空对象,也就是MapView,这个怎么会是null?我就奇了怪了,然后就看了下SupportMapFragment的代码

也就是mapV是空,我们在看下在哪里赋值

在这里初始化了 ,我们在继续跟踪看谁调用了这个方法

newInstance调用了,可是demo里面根本没有调用这个方法啊。。。你不说这谁知道。。。

解决办法

1
2
3
FragmentManager fm = getActivity().getSupportFragmentManager();
SupportMapFragment mapFragment=SupportMapFragment.newInstance(getActivity());
fm.beginTransaction().add(R.id.fl_content, mapFragment).commit();

在获取map之前手动掉一次,让它初始化即可