Xamarin.Android 使用百度地图获取定位信息
最近做一个项目,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/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了
输入秘钥库口令直接空格可跳过。
包名获取方式: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 { ; 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,设置返回的定位结果坐标系 ; 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()); } } }
第六步:查看输出结果
最后附上Demo地址:
链接: https://pan.baidu.com/s/1uHB3whb_aW1uKhJ1v9FLeg
密码: g4xr
记得要换成自己的AK哦~
Xamarin.Android 使用百度地图获取定位信息的更多相关文章
- ionic基于GPS定位并通过百度地图获取定位详细信息
相信所有的前端攻城狮都会碰到移动端App.里面获取用户定位信息. 那么问题来了,怎么获取用户的定位信息(经纬度)呢. 当然方法有很多,通过百度地图API 以及 高德地图 API都是可以的.但是两个获取 ...
- Android学习——百度地图开发定位与显示Demo
百度地图给我们提供了很丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新. 地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本号不 ...
- xamarin.android 绑定百度地图SDK遇到的问题
在 xamarin.android 绑定项目中,绑定 百度地图的LBS地图SDK,参考 https://developer.xamarin.com/guides/android/advanced_to ...
- Xamarin.Android 集成百度地图SDK
前言:趁着周六闲得没事干,赶紧搞一搞Xamarin,最近也是怪无聊的,枯燥的生活不如打几行代码带劲:好了我们进入正题 我这篇文章时参考一位大佬的博客进行改变的,当然他写的需要一定的经验才可以看得懂,我 ...
- Xamarin.Android调用百度地图
下载百度地图API Android SDK 在Visual Studio中创建绑定库(Android)项目 将jar文件添加到Jars文件夹中 生成该项目,如果遇到变量名称之类的问题,可在Transf ...
- 百度地图获取定位,实现拖动marker定位,返回具体的位置名
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- android使用百度地图SDK获取定位信息
本文使用Android Studio开发. 获取定位信息相对简单.我们仅仅须要例如以下几步: 第一步,注冊百度账号,在百度地图开放平台新建应用.生成API_KEY.这些就不细说了,请前往这里:titl ...
- Android studio 百度地图开发(2)地图定位
Android studio 百度地图开发(2)地图定位 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...
- Android 开发之集成百度地图的定位与地图展示
app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...
随机推荐
- HTML DOCTYPE 的重要性
定义和用法 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签:它是指示 we ...
- UGUI实现NGUI的UIEventListener功能
在unity中处理UI事件时,习惯了使用NGUI的UIEventListener,虽然UGUI也有AddListener,但是一个组件只能对应一个函数,不能在一个函数中同时处理多个事件,显得有些麻烦 ...
- spring揭秘 读书笔记 一 IoC初探
本文是王福强所著<<spring揭秘>>一书的读书笔记 ioc的基本概念 一个例子 我们看下面这个类,getAndPersistNews方法干了四件事 1 通过newsList ...
- 关于Yuri Boykov and Vladimir Kolmogorov 于2004年提出的max flow / min cut的算法的详解
出处:http://blog.csdn.net/euler1983/article/details/5959622 算法优化algorithmgraphtree任务 这篇文章说的是Yuri Boyko ...
- Linux用户配置文件(第二版)
/etc/passwd文件剖析 文件格式: root:x:0:0:root:/root:/bin/bash 用户名:密码位:UID:GID[缺省组ID]:注释性的描述信息:宿主目录:shell[7部分 ...
- LIRe 源代码分析 1:整体结构
===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...
- 传统定时器技术 Timer and TimerTask
本文为张孝祥java并发课程的学习笔记. java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时 ...
- 漫谈jdbc
本文可作为北京尚学堂jdbc课程的学习笔记; 简介 jdbc是什么东西? jdbc全称(Java Database Connectivity java数据库连接) 它是干什么的? 至于它是干什么的,那 ...
- LeetCode之“数学”:Rectangle Area
题目链接 题目要求: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle i ...
- Mybatis的resultType
使用mybatis去查询数据时,没有指定resultType,mybatis无法返回正常结果,当然在web中并没有出现报错,所以有点坑自己了,所以需要使用如下配置: <select id=&qu ...