天天看點

Xamarin.Android 使用百度地圖擷取定位資訊

最近做一個項目,web端使用百度地圖,PDA使用手持機自帶的GPS定位系統擷取經緯度,然後再百度地圖上顯示該經緯度會有一定距離的差異,這裡就像可樂的瓶子擰上雪碧的蓋子,能擰的上卻不美觀。是以為了資料的精确性,PDA端也用百度地圖的接口。

  

  下面主要流程分為以下幾步:

  1. 建立項目BaiduMapAPIDemo。
  2. 下載下傳百度地圖 --Android定位SDK 。
  3. Binging Labrary項目添加相關檔案。
  4. 注冊百度開發平台,建立應用,擷取AK。
  5. 寫入百度提供示例代碼。
  6. 檢視輸出結果。

第一步:建立項目名為BaiduMapAPIDemo的項目

Xamarin.Android 使用百度地圖擷取定位資訊

解決方案右鍵——> 添加 ——> 建立項目 ——> 綁定庫,名為BaiduMapAPI

Xamarin.Android 使用百度地圖擷取定位資訊

添加後呈現效果:

Xamarin.Android 使用百度地圖擷取定位資訊

第二步:下載下傳百度地圖  Android定位SDK  

http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all
Xamarin.Android 使用百度地圖擷取定位資訊

   下載下傳後的呈現效果:

Xamarin.Android 使用百度地圖擷取定位資訊

第三步:在Jars檔案夾下添加jar檔案,并将jar檔案的生成操作改為Embedded

Xamarin.Android 使用百度地圖擷取定位資訊

重新生成馬上就會報這個錯誤:

Xamarin.Android 使用百度地圖擷取定位資訊

  隻需要打開項目BaiduMapAPI - Transforms檔案夾 修改Metadata.xml檔案為以下,就不會生成錯誤。

<metadata>
  <attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">Addresses</attr>
</metadata>      
把下載下傳的libs檔案粘貼到Assets檔案夾下,并将so檔案的生成操作修改為AndroidNativeLibrary      
Xamarin.Android 使用百度地圖擷取定位資訊

項目中呈現效果:

Xamarin.Android 使用百度地圖擷取定位資訊

然後對BaiduMapAPI添加引用

Xamarin.Android 使用百度地圖擷取定位資訊

第四步:擷取通路應用(AK)  

http://lbsyun.baidu.com/apiconsole/key/create

SHA1擷取方式:

  找到本機的Mono for Android的位址,我的是 C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android

  然後cmd指令行輸入:cd /d C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android 然後再輸入 keytool -list -v -keystore debug.keystore 然後就能擷取SHA1了

  輸入秘鑰庫密碼直接空格可跳過。

Xamarin.Android 使用百度地圖擷取定位資訊

包名擷取方式:AndroidManifest.xml 下的package中的值就是包名

Xamarin.Android 使用百度地圖擷取定位資訊

百度AK建立呈現

Xamarin.Android 使用百度地圖擷取定位資訊
Xamarin.Android 使用百度地圖擷取定位資訊

第五步:在Android項目中的AndroidManifest.xml檔案中進行以下配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="BaiduMapAPIDemo.BaiduMapAPIDemo" 
          android:versionCode="1" 
          android:versionName="1.0">
  <uses-sdk android:minSdkVersion="21" />
  <application android:allowBackup="true" android:label="@string/app_name">
    <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="VsuhUI11WpW2kF" /> //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;
using Android.Locations;
using System.Collections.Generic;
using Java.Util;
namespace BaiduMapAPIDemo
{
    [Activity(Label = "BaiduMapAPIDemo", MainLauncher = true)]
    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号和大體定位時間到[email protected],會有人追查原因");
            }
            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());
        }

    }
}      

第六步:檢視輸出結果

Xamarin.Android 使用百度地圖擷取定位資訊

 最後附上Demo位址:

  連結: 

https://pan.baidu.com/s/1uHB3whb_aW1uKhJ1v9FLeg

  密碼: g4xr

記得要換成自己的AK哦~