前言:
圖片如果看不清,請右鍵保存,或者直接對網頁進行縮放,這些都是直接在電腦上截的圖,不存在看不清這種情況.
首先我要表示,我是站在巨人(原博文1 原博文2 )的肩膀上寫的這篇文章.
我的內容會更詳細一點,如果你有一定的基礎,請直接去看上面這兩篇博文.
我這篇文章可能會比較啰嗦........總之,有圖有真相,手把手教學.
文章里的所有步驟,都已經過驗證.
做個標記: 本文所使用的百度地圖android sdk是2017年10月3日下載的百度android sdk, 往后sdk的內容可能會有變化.
如有變化,你按照這篇文章按步驟操作,如未成功,請在文章下面留言,我會及時更新文章,與時俱進.
效果圖: 北京市的衛星圖
正文:
准備工作
一 : 打開網址:http://lbsyun.baidu.com/ 頁面右上角注冊百度賬號
二. 打開網址:http://lbsyun.baidu.com/ 頁面右上角登陸百度賬號.
三. 登陸成功后,點擊頁面右上角的API控制台.
四.點擊創建應用
五.填寫信息:
應用名稱: 你自己隨便寫,找個記事本記下來.(我的是:XamarinBaiDuMapSDK)
應用類型: Android SDK
*發布版SHA1: 接下來重點講這個.
*包名: XamarinBaiDuMapSDK.XamarinBaiDuMapSDK (中間有個點)
這個是百度官方給的如何獲取SHA1的教程: http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
六.接下來,本文的重點要出現了:獲取SHA1
我們是Xamarin,所以獲取的方式略有不同,其實也差不多,看你自己了,接下來,我會詳細介紹一下如何取SHA1,用我自己的方式,也是xamarin的方式.
Xamarin官方參考文章在這里: https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/MD5_SHA1/
1.找到你java jdk的 位置:
一般來說,在你安裝vs2017 xamarin的時候,vs2017會幫你把jdk 安裝在:
C:\Program Files\Java或C:\Program Files (x86)\Java (我的是在C:\Program Files\Java)
我的vs2017現在使用的jdk版本是jdk1.8.0_112.
所以,直接點進去,進到這個文件夾:C:\Program Files\Java\jdk1.8.0_112\bin (找個記事本,保存一下這個地址,一會兒會用到)
查看一下里面有沒有keytool這個exe 文件,如果有就沒任何問題了
2. 找到debug.keystore這個文件(Xamarin的debug.keystore)
我的debug.keystore是在 C:\Users\ **********\AppData\Local\Xamarin\Mono for Android (保存這個地址到你的記事本) (這個地址,如果你找不到,請在文章下面留言)
3.打開 命令提示符(cmd) (你可以在 小娜那里搜索cmd, 或者直接在附件的windows系統里找到命令提示符)
輸入: cd C:\Program Files\Java\jdk1.8.0_112\bin (打開你剛才你保存的記事本,找到這個地址,前面有加 cd), 回車.
輸入: keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" ,回車
輸入密鑰庫口令: android (默認是android,除非你修改過), 回車 (請手動輸入android 這7個英文字母, 不要復制,否則會出錯)
找到SHA1 這一行: 復制下來,妥善保存到記事本,千萬不要弄丟了,不然你還要再操作一遍,好麻煩的......
關閉命令提示符 窗口(cmd),ok,我們來做下一步.
七. 還記得剛才的網頁頁面嗎?
填寫 發布版SHA1 (到你的記事本里找一下,就是我們剛才復制的那行)
點擊,提交按鈕
八.保存 應用AK (妥善保存到記事本,一會兒會用到)
九. 下載BaiduMap sdk
打開網頁:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download ,點擊自定義下載
你會跳轉到這個頁面:http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar
我是百度地圖sdk 默認的那幾個,圖片在這里,我們一會要做的xamarin.android binding也只是針對 勾選的這幾個 所生成的sdk。所以如果你亂勾選,后面可能會成功不了.
點擊下載 開發包.
十. 打開這個壓縮包.
十一.
分析一下這個sdk文件, 只用兩種類型的文件,一種是.so 類型的,一種是.jar類型的.
jar類型,對應vs2017的生成操作是:EmbeddedJar
so類型,對應vs2017的生成操作是:EmbeddedNativeLibrary
十二.打開vs2017---文件--新建---項目--Android---綁定庫(Android)---名稱: BaiDuMapBindingProject
把BaiduLBS_AndroidSDK_Lib\libs 文件夾里的所有文件都復制放到BaiDuMapBindingProject的jars 文件夾下面(全選,復制,粘貼)
然后你把so 和jar文件的生成操作給修改成,剛才我們所寫的那樣子.
jar類型,對應vs2017的生成操作是:EmbeddedJar
so類型,對應vs2017的生成操作是:EmbeddedNativeLibrary
請注意,每一個.so文件 ,jar文件都要做 修改 生成操作,千萬要注意,一個都不能少!!!!
十三。重新生成解決方案.
出現了5 個error,91個warning
十四.安裝 jar反編譯軟件 JD-GUI
http://jd.benow.ca/
十五.讓我們來解決第一個error:
錯誤 CS0542 “VersionInfo”: 成員名不能與它們的封閉類型相同 Com.Baidu.Mapapi.VersionInfo.cs
運行 JD-GUI 打開BaiduLBS_Android.jar (地址:BaiduLBS_AndroidSDK_Lib\libs) 文件
查看生成后的C#文件
錯誤很明顯了,類名和類里面的常量名在 編譯后, 出現了名字相同這個錯誤.
解決方案如下: 打開Metadata.xml
<attr path="/api/package[@name='com.baidu.mapapi']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="name">VersionInformation</attr>
改一下常量名即可
VERSION_INFO ----> VersionInformation
重新生成解決方案.
十六.
讓我們來解決掉剩下的四個error.
方法的重載導致的問題,方法名相同,導致編譯后生成了相同名字的類.
4個error一起解決.
解決方案如下: 打開Metadata.xml
<attr path="/api/package[@name='com.baidu.mapapi.map']/interface[@name='BaiduMap.OnMapStatusChangeListener']/method[@name='onMapStatusChangeStart' and count(parameter)=2 and parameter[1][@type='com.baidu.mapapi.map.MapStatus'] and parameter[2][@type='int']]" name="managedName">OnMapStatusChangeStart2</attr>
重新生成解決方案.
0 error 95個warning(警告,今天就不管了)
十七.取走 BaiDuMapBindingProject\bin\Debug BaiDuMapBindingProject.dll文件(復制,找個地方保存好)
十八. 新建一個項目,vs2017----新建---項目---Android----單一視圖應用(Android)----名稱:BaiDuSDKDemoProject
引用,右鍵,瀏覽,添加 BaiDuMapBindingProject.dll
十九。參考百度的java文檔 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
在AndroidManifest.xml (項目Properties里面尋找這個文件) 中添加開發密鑰、所需權限等信息;
(1)在application中添加開發密鑰
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發者 key" /> </application>
還記得剛才我們保存的 訪問應用(AK) 嗎?
開發者 key就是那個.
如果你忘記保存,請自行尋找http://lbsyun.baidu.com/apiconsole/key
(2)添加所需權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="BaiDuSDKDemoProject.BaiDuSDKDemoProject" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="16" /> <application android:label="BaiDuSDKDemoProject"> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發者 key" /> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> </manifest>
二十.
第三步,在布局Main.axml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
第四步,在應用程序創建時初始化 SDK引用的Context 全局變量:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
注意:在SDK各功能組件使用之前都需要調用
SDKInitializer.initialize(getApplicationContext());,因此我們建議該方法放在Application的初始化方法中
打開MainActivity.cs文件,添加一行代碼即可
using Com.Baidu.Mapapi;
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SDKInitializer.Initialize(ApplicationContext); SetContentView(Resource.Layout.Main); }
注意:在SDK各功能組件使用之前都需要調用
SDKInitializer.initialize(getApplicationContext());,因此我們建議該方法放在Application的初始化方法中
第五步,創建地圖Activity,管理地圖生命周期;
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @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(); } }
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Com.Baidu.Mapapi; using Com.Baidu.Mapapi.Map; namespace BaiDuSDKDemoProject { [Activity(Label = "BaiDuSDKDemoProject", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { int count = 1; MapView mMapView = null; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SDKInitializer.Initialize(ApplicationContext); SetContentView(Resource.Layout.Main); mMapView = FindViewById<MapView>(Resource.Id.bmapView); var s = mMapView.Map; s.MapType = BaiduMap.MapTypeSatellite; } protected override void OnDestroy() { base.OnDestroy(); mMapView.OnDestroy(); } protected override void OnResume() { base.OnResume(); mMapView.OnResume(); } protected override void OnPause() { base.OnPause(); mMapView.OnPause(); } } }
二十一. 修改程序包名: 你還記得我們在api 控制台那里填寫的信息嗎?
注意圖上的"包名",和我們剛才新建的android項目的名字是不一樣,所以我們要手動修改.
項目,右鍵,屬性
修改程序包名稱: BaiDuSDKDemoProject.BaiDuSDKDemoProject----------------->>>>XamarinBaiDuMapSDK.XamarinBaiDuMapSDK
順便檢查一下應用程序圖標有沒有選上。
二十二。一切ok,開始調試.
成功了,效果圖在這里
效果圖: 北京市的衛星圖

剩下的有關百度地圖sdk的使用,就需要你自己去看百度地圖的文檔了,今天我們的教學就到這里了.
百度地圖的文檔:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap