Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 插件化接入百度地圖和高德地圖

插件化接入百度地圖和高德地圖

編輯:關於Android編程

我們的應用可能會用到地圖定位等功能,但是無論高德還是百度直接接入到應用中都會導致體積增大,甚至導致65535方法數問題,所以用插件的方式接入是個不錯的選擇。

這裡我用了Apkplug這個插件框架,下面是我的接入過程。

百度地圖接入

這裡介紹一下將百度地圖作為插件並接入宿主的例子,例子沒有將完備的功能接入,只是將一個定位界面接入,在宿主中點擊一下按鈕,彈出定位界面。

一、插件開發

其實比較麻煩的是賬號申請,key申請,所以先介紹一下這些相關的。

注冊的話,這裡不做詳細介紹,我第一次注冊,怎麼都要求我上傳什麼身份證正反面照片,我沒傳,第二次登陸的時候好像就不需要了,你遇到相同的情況,可以先退出,再登陸,也許可以繞過上傳證件照。

申請key,這個跟高德地圖的操作差不多,但是使用時有所差別,下面會說,先看一下key的申請。

這裡是百度地圖的控制台

\

點擊創建應用後,如下圖所示:

其中,apk簽名sha1值的取得參考這裡

這裡需要注意的是,一個應用想使用這個key,需要簽名、包名、key值相對應。地圖sdk是在插件中接入的,所以key值需要配置在插件裡,但是百度地圖sdk讀取包名時,會讀取宿主的,所以在創建key時,直接使用宿主包名,但是將生成的key配置到插件。如果為了測試時插件獨立運行,可以單獨為插件生成一套相應key,但是加入宿主時,必須換成宿主key

key的問題搞清楚後,就沒有太多坑了。按照百度地圖文檔添加一個定位界面即可。

 

這是activity中代碼:

    mMapView = (MapView) findViewById(R.id.bmapView);
    baiduMap = mMapView.getMap();
    // 開啟定位圖層
    baiduMap.setMyLocationEnabled(true);
    // 定位初始化
    mLocationClient = new LocationClient(this);
    mLocationClient.registerLocationListener(myListener);
    LocationClientOption option = new LocationClientOption();
    option.setOpenGps(true); // 打開gps
    option.setCoorType("bd09ll"); // 設置坐標類型
    option.setScanSpan(1000);
    mLocationClient.setLocOption(option);
    mLocationClient.start();

這些都在百度地圖文檔中可以查到,不做詳細介紹,包括初始化、權限、及組件的配置,直接參考百度文檔。沒什麼坑可說。先用插件單獨運行一下,能實現功能就算完成了。

然後按照套路,給插件設置plugin.xml



這樣一個插件就完成了。唯一需要注意的是上面提到的key的問題。

宿主開發

宿主開發中,需要將百度地圖的權限配置過來,是android 6.0的話記得手動獲取權限。其他沒啥坑了,按照套路來就行。

我這裡直接啟動activity

Intent intent = new Intent();
                    intent.setClassName(MainActivity.this, "com.apkplug.baidumapplug.MainActivity");
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);

這裡面還使用了一個異步啟動的例子:

org.osgi.framework.Bundle[] bundles = FrameworkFactory.getInstance().getFrame().getSystemBundleContext().getBundles();
            for(org.osgi.framework.Bundle bundle : bundles){
                if(bundle.getName().equals("BaiduMapPlug")){

                    bundle.start(new StartCallback() {
                        @Override
                        public void onSuccess(org.osgi.framework.Bundle bundle) {
                            Intent intent = new Intent();
                            intent.setClassName(MainActivity.this, "com.apkplug.baidumapplug.MainActivity");
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                            Log.e(this.getClass().getName(),bundle.getName());
                        }

                        @Override
                        public void onFail(org.osgi.framework.Bundle bundle, Throwable throwable) {
                            StringWriter sw = new StringWriter();
                            PrintWriter pw = new PrintWriter(sw);
                            throwable.printStackTrace(pw);

                            System.out.println(sw.toString()); // stack trace as a string
                            Log.e(this.getClass().getName(),throwable.toString());
                        }
                    });
                }
            }

如果一個插件,在初始化的時候很費時,則可以選擇異步啟動。

demo地址:

插件地址:https://github.com/apkplug/SDKDemo/tree/master/BaiduMapPlug

宿主地址:https://github.com/apkplug/SDKDemo/tree/master/BaiduMapPlugUser

*

高德地圖插件開發

下面介紹高德地圖的接入過程,我把高德地圖的一個簡單定位功能放到了插件裡,從宿主點一下按鈕就跳到插件的定位界面。

1 插件開發

首先注冊高德,注冊好後,比較關鍵的就是key的使用,高德地圖的各種接口調用都要檢測key,也是因為有人反映key的各種問題,所以這個例子重點說的其實是key的事。

key的管理在控制台:

\<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="" src="/uploadfile/Collfiles/20160817/20160817094551802.png" title="\" />

上面提到獲取sha1值的方法:參考這裡

搞定了key的問題,就好辦了,下面做一個定位的界面

在你的界面中加入地圖控件



然後在代碼中進行設置

    mlocationClient = new AMapLocationClient(getContext());
    mLocationOption = new AMapLocationClientOption();

    mMapView = ((MapView)getView().findViewById(R.id.map));
    mMapView.onCreate(savedInstanceState);
    aMap = mMapView.getMap();

    //對界面的監聽,這個要先設置
    aMap.setLocationSource(new LocationSource() {
        @Override
        public void activate(final OnLocationChangedListener onLocationChangedListener) {
            mlocationClient.setLocationListener(new AMapLocationListener() {
                @Override
                public void onLocationChanged(AMapLocation aMapLocation) {
                    onLocationChangedListener.onLocationChanged(aMapLocation);
                }
            });

            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            mlocationClient.setLocationOption(mLocationOption);
            mlocationClient.startLocation();
        }

        @Override
        public void deactivate() {
            if (mlocationClient != null) {
                mlocationClient.stopLocation();
                mlocationClient.onDestroy();
            }
            mlocationClient = null;
        }
    });
    aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設置默認定位按鈕是否顯示

    aMap.setMyLocationEnabled(true);// 設置為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,默認是false
    // 設置定位的類型為定位模式 ,可以由定位、跟隨或地圖根據面向方向旋轉幾種
    aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);

這樣界面就好了,你單獨運行插件應該就能定位了,如果返回錯誤碼,提示你key錯了,那你需要再好好看看上面設置key的說明。

然後按照套路,給插件設置plugin.xml



2 宿主開發

宿主不需要特殊說明什麼,按照套路來,初始化、安裝插件。按照高德地圖說明文檔配置權限。

直接用intent啟動插件就行

            Intent intent = new Intent();
            intent.setClassName(MainActivity.this, "com.apkplug.amapplug.MenuActivity");
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

demo代碼:

插件工程:https://github.com/apkplug/SDKDemo/tree/master/AMapPlug

宿主工程:https://github.com/apkplug/SDKDemo/tree/master/AMapPlugUser

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved