圖片若是看不清,請右鍵保存,或者直接對網頁進行縮放,這些都是直接在電腦上截的圖,不存在看不清這種狀況.javascript
首先我要表示,我是站在巨人(原博文1 原博文2 )的肩膀上寫的這篇文章.php
個人內容會更詳細一點,若是你有必定的基礎,請直接去看上面這兩篇博文.html
我這篇文章可能會比較囉嗦........總之,有圖有真相,手把手教學.java
文章裏的全部步驟,都已通過驗證. android
作個標記: 本文所使用的百度地圖android sdk是2017年10月3日下載的百度android sdk, 日後sdk的內容可能會有變化.windows
若有變化,你按照這篇文章按步驟操做,如未成功,請在文章下面留言,我會及時更新文章,與時俱進.api
效果圖: 北京市的衛星圖app
準備工做 ide
一 : 打開網址: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