本文為第一次匯入地圖類SDK,以百度地圖和高德地圖為例,騰訊地圖後續加入。
本文若有不當之處以及勘誤,歡迎留言指正。
百度和高德地圖開放平臺官網連結
步驟
1.獲取KEY
在相應的國內SDK開發者網站上獲取key
注意:
首次建立應用需要輸入的SHA1分兩種:測試版(又稱除錯版,看各平臺的描述),
釋出版的KEY SHA1 值是不同的,釋出 apk 時需要根據釋出 apk 對應的 keystore 重新配置 Key。
by 高德地圖申請開發金鑰步驟
每個Key唯一對應一個APP
by 百度地圖申請開發金鑰步驟
此步驟通常需要輸入釋出版SHA1,獲取方法:
- 系統終端獲取
- AS中終端獲取
命令:keytool -v -list -keystore
2.配置
配置過程通常需要X步,
2.1:將SDK匯入工程:新增so檔案
匯入so檔案,有兩種方法:
第一種:新建檔案目錄,工程會自動載入src目錄下的so檔案
路徑:
appsrcmain
- 新建jniLibs目錄
- 將各種架構的so檔案(夾)拷貝進其中。
第二種:修改gradle
applibs
新建libs,將各種架構的so檔案(夾)拷貝進其中,之後在
appbuild.gradle中:
android {
...
sourceSets{
main{
jniLibs.srcDir `libs` //新增此行,說明so的路徑為該libs路徑,關聯所有地圖SDK的so檔案
}
}
...
}
注意:此程式碼必須放在android括號內,否則會報錯:**
Could not get unknown property `jniLibs` for source set `main` of type
參考連結:CSDN部落格
2.2 新增Jar檔案/依賴程式碼
此處則根據專案(工程)需求自行填加所需jar。
有兩種方法:
在Project的build.gradle檔案中配置repositories,新增maven/jcenter倉庫地址 路徑: appbuild.gradle
1. allprojects {
2. repositories {
3. jcenter() // 或者 mavenCentral()
4. }
5. }
主工程配置依賴,有兩種方式:
將jar放在libs目錄下,之後(以下兩步可選其一):
1.1: jar的每個jar檔案:右鍵-Add As Library
1.2: File -Project Structure-Project Structure-module app, 點選 Dependencies,下方則會自動生成
相關依賴程式碼:
dependencies{
compile files(`libs/BaiduLBS_Android.jar`) //百度地圖
}
注意:官方文件中為 compile,最新為implementation,若輸入 compile則會出現以下報錯:
WARNING: Configuration `compile` is obsolete and has been replaced with `implementation` and `api`.
建議輸入最新寫法。
第二種:
或者直接使用引入libs下所有jar包的方式:
注意:此方式libs無需匯入jar包,即以上方法新增so檔案第二正方法不適用。
高德-Android Studio 配置工程:注意說明了這一點,我的高德地圖整合彙總連結復現了這一點,出現以下報錯:
Cause: archive is not a ZIP archive
顯示地圖
此處展示需要新增在地圖中的許可權以及key新增的位置,由於地圖不一致,所以只顯示其共同特點。
新增許可權
此處列舉出幾種地圖都需要的許可權,可能會有所出入。
路徑
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--獲取裝置網路狀態,禁用後無法獲取網路狀態-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--網路許可權,當禁用後,無法進行檢索等相關業務-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--讀取裝置硬體資訊,統計資料/讀寫手機狀態和身份-->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<!--讀取系統資訊,包含系統版本等資訊,用作統計-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--獲取裝置的網路狀態,鑑權所需網路代理,訪問WiFi網路資訊-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--允許sd卡寫許可權,需寫入地圖資料,禁用後無法顯示地圖-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!--獲取統計資料-->
<uses-permission android:name="android.permission.CAMERA" />
<!--使用步行AR導航,配置Camera許可權-->
<!--高德地圖-->
<!--允許程式訪問CellID或WiFi熱點來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
初始化地圖
參考連結:
百度:Android 地圖SDK-Hello BaiduMap
新增主要view
路徑
appsrcmainreslayoutactivity_main.xml
此處不同地圖的寬和高,match_parent/fill_parent,至於為什麼不一致,需要再探究。
<com.baidu.mapapi.map.MapView
android:id="@+id/amapView/bmapView" //高德或百度地圖
android:layout_width="match_parent/fill_parent" //高德或百度地圖
android:layout_height="match_parent/fill_parent" //高德或百度地圖
android:clickable="true" /> //百度地圖獨有
管理地圖生命週期
合理管理地圖生命週期。
路徑
appsrcmainjavaMain.activity.java
public class MainActivity extends Activity {
private MapView mMapView = null; //百度地圖
MapView mMapView = null; //高德地圖
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),銷燬地圖
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView.onResume (),重新繪製載入地圖
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪製
mMapView.onPause();
}
@Override //在這兩例中高德地圖獨有
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),儲存地圖當前的狀態
mMapView.onSaveInstanceState(outState);
}
}
}
以上註釋引用自高德地圖—第三步,初始化地圖容器,有新增百度地圖第二行初始化程式碼。
不同地圖的初始化時間
在新增主要view後百度地圖需要初始化之後即可顯示,
高德地圖在管理地圖生命週期後需要初始化地圖即可顯示,以下分別是他們的方法:
百度地圖初始化方法:
SDK引用
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地圖SDK所有介面均支援百度座標和國測局座標,用此方法設定您使用的座標型別.
//包括BD09LL和GCJ02兩種座標,預設是BD09LL座標。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
高德地圖初始化方法:高德地圖-顯示地圖
//定義了一個地圖view
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 此方法須覆寫,虛擬機器需要在很多情況下儲存地圖繪製的當前狀態。
//初始化地圖控制器物件
AMap aMap;
if (aMap == null) {
aMap = mapView.getMap();
}
注意:最新的Android Studio依照上述方法會報錯:錯誤: 可能尚未初始化變數aMap
則需要修改為:
AMap aMap = null;
if (aMap == null) {
aMap = mapView.getMap();
}
}
總結
在百度地圖的開發教程中,首先配置,隨後Hello Baidumap一章即可顯示百度地圖在介面中,很方便的表現出了“次序”,所見即所得。
高德地圖文件則首先配置,其次需要在建立地圖裡的顯示地圖中新增相應許可權,之後在顯示地圖的過程中再次包含了配置的過程,最後則顯示地圖,
此舉可能是有考慮到開發者檢查是否正確,但根據我的連結,出現錯誤後直接在論壇上反饋,而並非向下看,高德地圖在這一點上可以標註一下。
高德地圖開發者文件,則明顯地列舉出了步驟以及網頁,很好的使用了導航邏輯, 使得本文可以順利的使用mardown語言進行標記以及引用各個部分的連結,百度開放平臺可以學習一下。
本文同時發表在我的個人部落格:故事熊
歡迎評論留言以及觀光。