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


前言:  

圖片如果看不清,請右鍵保存,或者直接對網頁進行縮放,這些都是直接在電腦上截的圖,不存在看不清這種情況.

首先我要表示巨人原博文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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM