Xamarin.Android 使用百度地图获取定位信息

农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述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="https://www.songbingjia.com/android/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哦~
 

【Xamarin.Android 使用百度地图获取定位信息】 

    推荐阅读