[置頂] Xamarin android如何調用百度地圖入門示例(一)

在Xamarin android如何調用百度地圖呢?

首先咱們要區分清楚,百度地圖這是一個普遍的概念,不少剛剛接觸這個名詞」百度地圖api」,的確是泛泛而談,咱們來看一下百度地圖的官網:php


android上使用百度地圖的有Android地圖SDK,定位SDK,導航SDK,全景SDK......等等雖然平時項目中可能會用到,可是不必定每個SDK都能熟練掌握,xamarin android中如何使用百度地圖的這些SDK呢,好吧,說這麼多廢話其實我想寫的就是html

在Xamarin android如何使用百度地圖的定位sdk

首先我來看一下效果:

下面主要流程分爲如下幾步:
  1. 新建項目 Binging Labrary(android)
  2. 下載百度地圖 --Android定位SDK    
  3. Binging Labrary項目添加相關文件
  4. 註冊百度開發平臺,建立應用,獲取AK(要注意這一點)
  5. 建立Android項目引用Binging Labrary項目
  6. 寫入百度提供示例代碼,成功。

第一步:建立Binding Labrary(Android)android


第二步:下載百度地圖  Android定位SDK http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-downloadgit

第三步:在Jars文件夾下添加jar文件,並將jar文件的生成操做改成Embedded.jar如圖:api


從新生成立刻就會報這個錯誤:網絡


只須要打開項目DWService - Transforms文件夾 修改Transforms-metadata.xml文件爲如下,就不會生成錯誤。app

 
 
 
 
<metadata>
  <attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">Addresses</attr>
</metadata>
新建文件夾Assets:把下載的如下文件粘貼到Assets文件夾下,並將so文件的生成操做修改成EmbeddedNativeLibrary
第四步:到了最關鍵的時候,若是不是很明白這一步的操做,能夠百度一下。這一步的目的是獲取訪問應用(AK)如圖:

建立應用後,填寫SHA1,那麼如何獲取SHA1的方法有不少,看了不少博客,可是Xamarin android 獲取sha1這種方式 在Dos中輸入命令的方式有時候沒有做用,以前在我筆記本上的操做竟然沒有做用,有點鬱悶,我這個臺式又能夠獲取 。 輸入路徑 :C:\Users\zhanglin\AppData\Local\Xamarin\Mono for Android 命令:keytool -list -v -keystore debug.keystore 輸入密鑰口令:直接回車鍵,若是不行的輸入Android。建立應用的時候包名就是AndroidManifest.xml文件中package屬性的值


固然你能夠用其餘的方式獲取sha1,下載MCodeCheck,也能夠查看sha1值ide

第五步:建立一個Android項目並添加引用,引用就是項目-解決方案新建的這個BaiduServer函數

第六步:在Android項目中的AndroidManifest.xml文件中進行一下配置:ui

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="BaiduDW.BaiduDW" android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="16" />
  <application android:label="BaiduDW">
    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>
    <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="CUm5LGTd4Y38YLXXzs3xjfNa0dvV8BOT" /> //key:開發者申請的Key
  </application>
  <!-- 這個權限用於進行網絡定位-->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
  <!-- 這個權限用於訪問GPS定位-->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
  <!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  <!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  <!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  <!-- 用於讀取手機當前的狀態-->
  <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  <!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  <!-- 訪問網絡,網絡定位須要上網-->
  <uses-permission android:name="android.permission.INTERNET" />
  <!-- SD卡讀取權限,用戶寫入離線定位數據-->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
</manifest>
在MainActivity.cs中引入Com.Baidu.Location , System.Text,並實現接口IBDLocationListener,例子代碼是百度官方的。所實現的效果調試中的輸出能夠看到。

using System;
using Android.App;
using Android.OS;
using Com.Baidu.Location;
using System.Text;
namespace BaiduMapDemo
{
    [Activity(Label = "BaiduMapDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity,IBDLocationListener
    {
        int count = 1;
        public LocationClient mLocationClient = null;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            mLocationClient = new LocationClient(ApplicationContext);     //聲明LocationClient類
            mLocationClient.RegisterLocationListener(this);    //註冊監聽函數
            StartLocationService();
        }
        private void StartLocationService()
        {
            LocationClientOption option = new LocationClientOption();
            option.SetLocationMode(LocationClientOption.LocationMode.HightAccuracy);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
            option.CoorType = "bd09ll";//可選,默認gcj02,設置返回的定位結果座標系
            int span = 1000;
            option.ScanSpan = span;//可選,默認0,即僅定位一次,設置發起定位請求的間隔須要大於等於1000ms纔是有效的
            option.SetIsNeedAddress(true);//可選,設置是否須要地址信息,默認不須要
            option.OpenGps = true;//可選,默認false,設置是否使用gps
            option.LocationNotify = true;//可選,默認false,設置是否當GPS有效時按照1S/1次頻率輸出GPS結果
            option.SetIsNeedLocationDescribe(true);//可選,默認false,設置是否須要位置語義化結果,能夠在BDLocation.getLocationDescribe裏獲得,結果相似於「在北京天安門附近」
            option.SetIsNeedLocationPoiList(true);//可選,默認false,設置是否須要POI結果,能夠在BDLocation.getPoiList裏獲得
            option.SetIgnoreKillProcess(false);//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死  
            option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集
            option.EnableSimulateGps = false;//可選,默認false,設置是否須要過濾GPS仿真結果,默認須要
            mLocationClient.LocOption = option;
            mLocationClient.Start();
        }
        public void OnReceiveLocation(BDLocation location)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("time : ");
            sb.Append(location.Time);
            sb.Append("\nerror code : ");
            sb.Append(location.LocType);
            sb.Append("\nlatitude : ");
            sb.Append(location.Latitude);
            sb.Append("\nlontitude : ");
            sb.Append(location.Longitude);
            sb.Append("\nradius : ");
            sb.Append(location.Radius);
            if (location.LocType == BDLocation.TypeGpsLocation)
            {// GPS定位結果
                sb.Append("\nspeed : ");
                sb.Append(location.Speed);// 單位:千米每小時
                sb.Append("\nsatellite : ");
                sb.Append(location.SatelliteNumber);
                sb.Append("\nheight : ");
                sb.Append(location.Altitude);// 單位:米
                sb.Append("\ndirection : ");
                sb.Append(location.Direction);// 單位度
                sb.Append("\naddr : ");
                sb.Append(location.AddrStr);
                sb.Append("\ndescribe : ");
                sb.Append("gps定位成功");
            }
            else if (location.LocType == BDLocation.TypeNetWorkLocation)
            {// 網絡定位結果
                sb.Append("\naddr : ");
                sb.Append(location.AddrStr);
                //運營商信息
                sb.Append("\noperationers : ");
                sb.Append(location.Operators);
                sb.Append("\ndescribe : ");
                sb.Append("網絡定位成功");
            }
            else if (location.LocType == BDLocation.TypeOffLineLocation)
            {// 離線定位結果
                sb.Append("\ndescribe : ");
                sb.Append("離線定位成功,離線定位結果也是有效的");
            }
            else if (location.LocType == BDLocation.TypeServerError)
            {
                sb.Append("\ndescribe : ");
                sb.Append("服務端網絡定位失敗,能夠反饋IMEI號和大致定位時間到loc-bugs@baidu.com,會有人追查緣由");
            }
            else if (location.LocType == BDLocation.TypeNetWorkException)
            {
                sb.Append("\ndescribe : ");
                sb.Append("網絡不一樣致使定位失敗,請檢查網絡是否通暢");
            }
            else if (location.LocType == BDLocation.TypeCriteriaException)
            {
                sb.Append("\ndescribe : ");
                sb.Append("沒法獲取有效定位依據致使定位失敗,通常是因爲手機的緣由,處於飛行模式下通常會形成這種結果,能夠試着重啓手機");
            }
            sb.Append("\nlocationdescribe : ");
            sb.Append(location.LocationDescribe);// 位置語義化信息
            System.Collections.Generic.IList<Poi> list = location.PoiList;// POI數據
            if (list != null)
            {
                sb.Append("\npoilist size = : ");
                sb.Append(list.Count.ToString());
                foreach (Poi p in list)
                {
                    sb.Append("\npoi= : ");
                    sb.Append(p.Id + " " + p.Name + " " + p.Rank);
                }
            }
            System.Diagnostics.Debug.Write(sb.ToString());
        }
    }
}

關於android中使用gps定位獲取位置相關信息:http://blog.csdn.net/kebi007/article/details/74936979

做者:張林

標題:xamarin android如何調用百度地圖入門示例(一)原文地址:http://blog.csdn.net/kebi007/article/details/52887570

轉載隨意註明出處

相關文章
相關標籤/搜索