編輯:關於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
*
下面介紹高德地圖的接入過程,我把高德地圖的一個簡單定位功能放到了插件裡,從宿主點一下按鈕就跳到插件的定位界面。
首先注冊高德,注冊好後,比較關鍵的就是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
宿主不需要特殊說明什麼,按照套路來,初始化、安裝插件。按照高德地圖說明文檔配置權限。
直接用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
很多時候需要先判斷當前用戶的網絡,才會繼續之後的一些處理邏輯。但網絡類型獲取這一塊,我用我自己的的手機調試時遇到一些問題,這裡記錄一下。一加手機一代,移動4G 網絡,得到
進入到相應job的配置頁面。Lint:1.在增加構建後操作中添加lint2.在高級中添加lint的通過標准monkey1.在跑monkey前需要將此次構建的apk包安裝到
本文實例講述了Android中Matrix用法。分享給大家供大家參考,具體如下:Matrix ,中文裡叫矩陣,高等數學裡有介紹,在圖像處理方面,主要是用於平面的縮放、平移
版本控制是項目開發過程中必不可少的部分,不管是個人還是團隊,靈活的使用版本控制將會使項目開發變得更加輕松。Android Studio集成了版本控制系統,目前支持CVS、