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

前言

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

Bug1:使用RxJava集成sdk报错

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

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下面加入

android {
    packagingOptions {
        exclude 'META-INF/rxjava.properties'
    }
}

Bug2:getMap()空指针

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

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);

这个是布局

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

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

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里面根本没有调用这个方法啊。。。你不说这谁知道。。。

解决办法

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

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