【Android】3.0 第3章 百度地圖及其應用--預備知識

分類:C#、Android、VS201五、百度地圖應用; 建立日期:2016-02-04html

1、概述

這一章先來點有意思的百度地圖應用示例,而後再分章詳細介紹用C#開發Android App的各類基本技術。android

本章以百度官網2016年1月發佈的地圖API(3.7.1版)爲例,演示如何用C#和VS2015編寫百度地圖應用程序,這些示例程序既能夠在Android 6.0的x86模擬器中運行,也能夠發佈到Android 4.0以上版本的手機中測試實際運行的效果。算法

一、下載官網提供的Demos

首先訪問下面的網址:api

http://developer.baidu.com/map/網絡

打開網頁後,選擇【開發】à【Andoid開發】下的第1項「Android地圖SDK」,單擊該網頁中的【相關下載】,就會出現下面的界面:app

image

單擊【自定義下載】,在彈出的界面中,除了導航功能外,其餘所有選中,而後將其下載到本機中,並解壓到某個文件夾下,以便後續的步驟使用它。函數

二、使用Gaxaxy_Api23_x86模擬器觀察運行結果

爲了解決MapView使用硬件加速時存在的問題,百度提供了一個TextureMapView控件,使用此控件呈現地圖時,要求修改模擬器的開發者選項。工具

要使用TextureMapView顯示百度地圖,須要知足下面的條件:測試

  • 將全部官方示例中的MapView所有改成用TextureMapView控件來呈現。
  • 修改模擬器的開發者選項,將其設置爲容許模擬器「強制進行GPU渲染」(以下圖所示)。

image

這兩個條件都知足後,百度地圖才能順利顯示出來。spa

好了,之後也不須要忍受沒有硬件加速的ARM模擬器那個特別的「慢」了,後面的例子將繼續用帶硬件加速的x86模擬器來演示。

固然也能夠直接用手機調試運行(這是建議的調試辦法,手機連上電腦後可直接在debug右側的下拉框中看到該手機的選項,用這種辦法調試地圖應用程序也更符合實際。可是,因爲手機調試截圖麻煩,因此這裏仍是直接用模擬器來演示了。

2、建立BdMapV371BindingLib解決方案

解決方案和項目名:BdmapV371BindingLib

模板:Bindings Library(Android)

建立綁定庫的目的是將百度地圖SDK 3.7.1版本的全部.jar文件自動轉換爲.cs文件並生成對應的.dll文件,轉換之後,就能夠在應用項目中引用生成的.dll文件了。

這也是轉換.jar文件爲.cs文件最經常使用的辦法。

一、添加JAR文件

將如下文件複製到項目的jars文件夾下,並將這些文件的【生成操做】屬性所有改成「EmbeddedJar」。

BaiduLBS_Android.jar

IndoorscapeAlbumPlugin.jar

二、添加最新穩定版Xamarin.Android.Support.v4的引用

鼠標右擊【引用】à【管理NuGet程序包】,添加最新穩定版Xamarin.Android.Support.v4的引用,本人添加的是Xamarin.Android.Support.v4.23.1.1.0。

三、修改Metadata.xml文件

打開Transforms文件夾下的Metadata.xml文件,將其改成下面的內容:

<metadata>
  <attr path="/api/package[@name='com.baidu.mapapi']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="managedName">VersionInfoString</attr>
  <attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='A']/field[@name='a']" name="managedName">aVar</attr>
  <attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='B']/field[@name='b']" name="managedName">bVar</attr>
  <attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="managedName">AddressString</attr>
  <attr path="/api/package[@name='com.baidu.mapapi.cloud']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="managedName">VersionInfoString</attr>
  <attr path="/api/package[@name='com.baidu.mapapi.radar']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="managedName">VersionInfoString</attr>
  <attr path="/api/package[@name='com.baidu.mapapi.search.core']/class[@name='g']" name="obfuscated">false</attr>
  <attr path="/api/package[@name='com.baidu.mapapi.search.district']/class[@name='DistrictSearch']" name="managedName">DistrictSearchs</attr>
  <attr path="/api/package[@name='com.baidu.pano.platform.comapi.a']/class[@name='a']" name="obfuscated">false</attr>
  <attr path="/api/package[@name='com.baidu.location']/class[@name='LocationClientOption']/field[@name='mLocationMode']" name="visibility">public</attr>
  <attr path="/api/package[@name='com.baidu.mapapi.a.a']/class[@name='a']" name="obfuscated">false</attr>
</metadata>

四、添加BaiduMapOptions.cs文件

在Additions文件夾下添加該文件,而後將其改成下面的內容:

namespace Com.Baidu.Mapapi.Map
{
    public partial class BaiduMapOptions
    {
        public BaiduMapOptions() { }
    }
}

該文件的用途是提供一個不帶參數的構造函數,若是不添加該文件,沒法直接在後續節的Demos項目中建立BaiduMapOptions的實例(這一節用不到它)。

五、生成dll文件

鼠標右擊該項目名,選擇【生成】,此時應該在【輸出】窗口中看到編譯成功了:

========== 所有從新生成: 成功 1 個,失敗 0 個,跳過 0 個 ==========

這樣一來,在bin\debug文件夾下就成功生成了BdMapV371BindingLib.dll,之後就能夠在示例項目中引用這個.dll文件了。

3、建立BdMapV371Demos解決方案並獲取開發密鑰

解決方案和項目名:BdmapV371Demos

模板:Blank App(Android)

開發百度地圖應用程序時,須要先在百度官網上申請一個開發密鑰,百度的開發密鑰由「SHA1+包名」組合組成,這是爲了讓一個項目惟一對應一個申請的密鑰(key)。密鑰申請成功後,才能在對應的項目中使用百度地圖API。

一、修改AndroidManifest.xml文件

修改BdMapV371Demos項目的該文件,將其改成下面的內容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="BdMapV371Demos.BdMapV371Demos" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
    <uses-sdk />
    <application android:label="BdMapV371Demos" android:theme="@style/MyCustomTheme">
        <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你申請的密鑰" />
        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" />
    </application>
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!-- 訪問網絡,網絡定位須要上網-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 這個權限用於進行網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 用於讀取手機當前的狀態-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- SD卡讀取權限,用戶寫入離線定位數據-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!--容許應用讀取低級別的系統日誌文件 -->
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
    <!--
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.LOCATION_HARDWARE" />
    <uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />
  -->
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="false" android:resizeable="true" android:smallScreens="true" />
</manifest>

二、運行項目獲得SHA1

按<F5>鍵運行項目,在輸出窗口中找到下面這一行:

D/auth info( 3210): mcode: 【……】;BdMap361Test.BdMap361Test

其中,分號前的【……】就是SHA1,複製它,以備下一步申請密鑰用。

說明:建立另外一個解決方案和項目時,只要你的開發環境不變,調試模式的SHA1仍是這個值(這個值與是哪一個項目無關,而是與debug.keystore文件有關),因此最好把這個SHA1保存在單獨的文檔中,以便之後用它申請多個開發密鑰。

固然,因爲這一步尚未完成密鑰申請的第2步,如今還看不到地圖。

實際上,你稍微觀察一下輸出窗口,就會發現當你按<F5>鍵調試運行後,系統首先自動執行的就是下面介紹的這些命令。或者說,這些步驟是系統自動完成的,不須要你去作。這裏之因此解釋一下這些命令的含義,目的只是爲了幫你理解它是如何獲得SHA1並自動顯示出來讓你去使用的):

對於Windows操做系統來講,默認狀況下,能夠在如下位置找到Xamarin.Android調試版本的用於應用程序簽名的密鑰庫:

C:\Users\[USERNAME]\AppData\Local\Xamarin\Mono for Android\debug.keystore

經過JDK提供的keytool命令,可獲得密鑰存儲庫的信息。對於Windows系統來講,keytool的位置爲:C:\Program Files (x86)\Java\jdk1.7.0_79\bin keytool.exe。

在VS2015中的使用辦法爲(不須要你去配置環境變量):依次單擊【工具】à【Android】à【Android Adb Command Prompt】,這樣就進入了命令行模式。

在命令行模式下,可以使用下面的命令形式運行keytool工具:

keytool -list -v -keystore [STORE FILENAME] -alias [KEY NAME] -storepass [STORE PASSWORD] -keypass [KEY PASSWORD]

鍵入的具體命令爲(注意[USERNAME]應該替換爲實際的名字):

C:\

cd\users\[USERNAME]\appdata\local\Xamarin\Mono for Android

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

此時你在控制檯窗口中將會看到下面的內容:

別名: androiddebugkey

序列號:……(此處省略了具體值)

有效期開始日期: ……(此處省略了具體值)

截止日期: ……(此處省略了具體值)

證書指紋:

MD5: ……(此處省略了具體值)

SHA1: ……(此處省略了具體值)

SHA256:……(此處省略了具體值)

簽名算法名稱: SHA256withRSA

版本: 3

擴展

……

三、進入官網獲取開發密鑰

進入百度的官網(http://developer.baidu.com/map/),選擇【開發】à【Andoid開發】下的第1項「Android地圖SDK」,而後單擊該網頁中的【申請密鑰(key)】,選擇【進入新的key申請系統】,輸入下面的信息:

應用名稱:BdMapV371Demos

應用類型:Android SDK

數字簽名(SHA1):

包名:BdMapV371Demos.BdMapV371Demos

對於C#項目來講,這裏輸入的包名其實是「解決方案名.項目名」,並無所有是小寫字母的要求。

將上一步複製的SHA1粘貼到「數字簽名(SHA1)」右側的文本框中。

單擊【提交】按鈕,完成密鑰申請。

四、將申請的密鑰填入到配置文件中

修改AndroidManifest.xml文件,在Application中填入你剛申請的密鑰。

之後再爲新項目申請新的密鑰時,只要開發環境不變,這個SHA1值就不會變化。之後再申請新的密鑰時,直接填入這個SHA1值就好了。

接下來就能夠逐步調試本章後面介紹的示例了。

【上一篇】第2章(2)PhonewordApp--第1個Andoid應用程序   【下一篇】第3章(2)建立本章示例項目

相關文章
相關標籤/搜索