Xamarin.Android Binding-----百度地圖SDK

前言:  

圖片若是看不清,請右鍵保存,或者直接對網頁進行縮放,這些都是直接在電腦上截的圖,不存在看不清這種狀況.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
相關文章
相關標籤/搜索