Android百度地圖黑線、無法拖動、個性化地圖的坑

    1.黑線問題

    例如鎖屏返回黑線,頁面回退黑線,dialog黑線。這些問題90%出在沒有在合適位置調用百度地圖的生命週期所造成的。所謂的合適位置並不是一定像官方文檔裏或者demo裏寫的那樣,在Activity/Fragment的生命週期裏寫上百度地圖相應的生命週期,而是要根據項目情況不同區分處理。

    舉個例子,我們在一個全屏的MapView裏打開了一個半透明/非全屏的Activity2如下圖所示

    這個時候,Mapview所在的Activity1會執行onPause。在結束掉Activity2的時候,Activity1會執行OnResume。這種情況下在相應的生命週期裏寫上百度地圖的生命週期函數是沒有問題的。

    然而,我們在這個頁面再打開一個全屏的Activity3,當我們關閉Activity3回到這個頁面的時候,黑線出現了。原因就是這個操作會分別執行一次Activity2的onPause/onResume,而Activity1的生命週期並沒有執行到!

    所以,百度地圖的生命週期函數使用更準確的說法應該是,在百度地圖不可見的時候調用mapView.onPause,在百度地圖可見的時候調mapView.onResume,也就是說在Activity2的生命週期裏通知Activity1裏的百度地圖執行相應的生命週期函數就可以了。


    2.鎖屏解鎖/回退後地圖無法拖動的問題

    確保在正確調用百度地圖週期,升級你的SDK版本至4.5.2,並使用MapView構造地圖。4.5.2以後MapView可以完全取代TextureMapview,並且優化了fragment切換地圖的閃黑屏現象和部分設備無法拖動地圖的現象!


    3.個性化百度地圖無效的問題

    自定義皮膚的正確使用姿勢如下 (測試通過的SDK版本4.3.1-4.5.2)

    注意Assets裏的customStyle就是你的自定義皮膚json,不能有後綴,裏面直接寫json。這個方法必須放在setContentView以及SDKInitializer.initializ()之前執行!

SDKInitializer.initialize(getContext().getApplicationContext());
之前執行!
/**
     * 設置個性化地圖config文件路徑
     */
    private void setMapCustomFile(Context context, String PATH) {
        FileOutputStream out = null;
        InputStream inputStream = null;
        String moduleName;
        try {
            inputStream = context.getAssets()
                    .open("customStyle/" + PATH);
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);

            moduleName = context.getFilesDir().getAbsolutePath();
            File f = new File(moduleName + "/" + "map_style.txt");
            if (f.exists()) {
                f.delete();
            }
            f.createNewFile();
            out = new FileOutputStream(f);
            out.write(b);
            MapView.setCustomMapStylePath(moduleName + "/" + "map_style.txt");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    然後再地圖加載完成的回調中

 //地圖加載完成回調,(只在初始化調一次)
        bdMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                MapView.setMapCustomEnable(true);
            
                }
            }
        });

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章