最近做一個項目,web端使用百度地圖,PDA使用手持機自帶的GPS定位系統擷取經緯度,然後再百度地圖上顯示該經緯度會有一定距離的差異,這裡就像可樂的瓶子擰上雪碧的蓋子,能擰的上卻不美觀。是以為了資料的精确性,PDA端也用百度地圖的接口。
下面主要流程分為以下幾步:
- 建立項目BaiduMapAPIDemo。
- 下載下傳百度地圖 --Android定位SDK 。
- Binging Labrary項目添加相關檔案。
- 注冊百度開發平台,建立應用,擷取AK。
- 寫入百度提供示例代碼。
- 檢視輸出結果。
第一步:建立項目名為BaiduMapAPIDemo的項目

解決方案右鍵——> 添加 ——> 建立項目 ——> 綁定庫,名為BaiduMapAPI
添加後呈現效果:
第二步:下載下傳百度地圖 Android定位SDK
http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all下載下傳後的呈現效果:
第三步:在Jars檔案夾下添加jar檔案,并将jar檔案的生成操作改為Embedded
重新生成馬上就會報這個錯誤:
隻需要打開項目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
項目中呈現效果:
然後對BaiduMapAPI添加引用
第四步:擷取通路應用(AK)
http://lbsyun.baidu.com/apiconsole/key/createSHA1擷取方式:
找到本機的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了
輸入秘鑰庫密碼直接空格可跳過。
包名擷取方式:AndroidManifest.xml 下的package中的值就是包名
百度AK建立呈現
第五步:在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());
}
}
}
第六步:檢視輸出結果
最後附上Demo位址:
連結:
https://pan.baidu.com/s/1uHB3whb_aW1uKhJ1v9FLeg密碼: g4xr
記得要換成自己的AK哦~