Xamarin Android 集成百度定位SDK

jqj2013 2016-10-20 02:45:14
一、准备工作
1、下载sha1 查看apk “MCodeCheck“备用。
2、下载安卓模拟器(非sdk原生模拟器,国内的一些模拟器如夜神、逍遥之类的),因为百度定位sdk不支持原生模拟器。如使用真机无需下载。
3、申请百度开发者帐号,下载百度定位sdk包,解压备用。
二、正式开始
1、打开VS创建安卓应用,创建android 项目

2、解决方案添加 Binding Library 项目(本例子命名DWService)

3、将解压好的百度定位sdk jar文件拷贝到DWService 项目的Jar文件夹,选中jar文件设置生成操作为EmbeddedJar

4、在DWService中添加文件夹Assets(严格按照此名命名),将定位SDK中的so文件连带文件夹拷贝到此文件夹中,并将所有so的生成操作设定为EmbeddedNativeLibrary

5、生成DWService,生成时会报重名错误,此时,打开项目DWService-Transforms-metadata.xml文件,按照如下格式输入

 <metadata>
<attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">Addresses</attr>
</metadata>


大致意思就是将这个地方的这个变量的名字改为Addresses再进行生成,就会生成成功!

6、在android项目中引用DWService就可以了,下面是如何使用。本人调试喜欢用国内的模拟器(可自行下载),如使用真机调试此步请直接跳过,进入第7步。
我以逍遥安卓模拟器为例,启动逍遥模拟器,一开始VS是识别的,但是生成过程中VS启动adb服务后就无法识别逍遥模拟器。关键来啦!!!点击VS中工具-android-android adb command prompt 命令提示行工具,输入 adb connect 127.0.0.1:21503(夜神安卓是adb connect 127.0.0.1:62001)
这时再进行调试就可以了。


7、将准备工作中第一步下载的MCodeCheck装在模拟器或真机上,然后调试android项目,此时在模拟器或者真机上打开MCodeCheck,选择你调试时安装上的app,查看sha1信息(申请key需要)sha1记录备用。

8、打开百度定位sdk开发者平台,api控制台,创建应用,输入应用信息,名称,应用类型选择Android SDK,输入你发布app的keystore sha1(发布的sha1可以将程序用你的keystore发布后再使用MCodeCheck查看,如第七步)和刚才咱们获得的调试的sha1,再输入包名(从AndroidManifest.xml中获得,package属性的值就是包名)。点击提交,获得开发者KEY。

9、然后配置AndroidManifest.xml文件
<?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="6DTzbd3iSEPaGtwhFeL6MxTSFfPFeP9S" /> //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>

10、打开MainActivity,添加引用using Com.Baidu.Location;和using System.Text;添加继承接口IBDLocationListener右键实现接口。
a.先声明一个LocationClient,然后在oncreate方法中实例化,参数为ApplicationContext,再用LocationClient进行注册百度sdk定位服务,参数为this。
b.编辑StartLocationService函数设置各项百度定位的参数,实现开始定位方法。
c.oncreate方法中,调用StartLocationService();
d.接收到的位置信息在OnReceiveLocation方法中进行调用,例子中是翻译的百度官方demo中的,这里可以自己进行自行调用。
具体上代码了:
using Android.App;
using Android.Widget;
using Android.OS;

using Com.Baidu.Location;
using System.Text;
namespace BaiduDW
{
[Activity(Label = "BaiduDW", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity, IBDLocationListener
{

public LocationClient mLocationClient = null;



protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

// Set our view from the "main" layout resource
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)
{
//System.Diagnostics.Debug.Write(p0.LocType);
//if (p0.LocType == 161)
//{
// //从此处取值即可
// System.Diagnostics.Debug.Write(p0.AddrStr);

//}
//Receive 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());

}
}
}



11、调试程序,如果返回值error code 为161 ,那么恭喜你,你已经设置成功了,可以将取到的定位值应用到你的爱啪啪中了。

12、其他未尽事宜请参阅百度地图sdk http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc 开发者指南
13、具体源码以及MCodeCheck,可从此http://download.csdn.net/detail/jqj2013/9656018 下载。

...全文
2334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15397935 2016-10-21
  • 打赏
  • 举报
回复
引用 2 楼 jqj2013 的回复:
引用 1楼qq_15397935 的回复:
顶,有没有做过科大讯飞的语音识别,是不是要改成JDK8,我用JDK7一直不行
回头找个时间试试,我的的确是jdk1.8




用JDK1.8编这个库自动生成的代码就报这些错
jqj2013 2016-10-20
  • 打赏
  • 举报
回复
引用 1楼qq_15397935 的回复:
顶,有没有做过科大讯飞的语音识别,是不是要改成JDK8,我用JDK7一直不行
回头找个时间试试,我的的确是jdk1.8
qq_15397935 2016-10-20
  • 打赏
  • 举报
回复
顶,有没有做过科大讯飞的语音识别,是不是要改成JDK8,我用JDK7一直不行

436

社区成员

发帖
与我相关
我的任务
社区描述
欢迎来到Xamarin技术交流论坛学习交流,Xamarin是一个行动App开发平台,开发人员透过Xamarin可开发出iOS、Android 与Windows 等平台的...
社区管理员
  • Xamarin技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧