百度定位功能封装
来源:互联网 发布:python concat函数 编辑:程序博客网 时间:2024/04/29 10:41
public class BaiduLocationHelper {
public interface MyLocationResultI
{
public void doLocationResult(HashMap hmResult);
}
private Dialog dlgWait;
private LocationClient mLocationClient;
private Date locationStartDate = null; // 定位开始时间
private Date locationEndDate = null; // 定位结束时间
MyLocationResultI myLocationResultI = null;
public void setLocationCallBack(MyLocationResultI mr)
{
myLocationResultI = mr;
}
/**
*
* @函数名称: startLocation
* @功能描述: 开始定位请求,结果在回调中
* @return void
* @throws
*/
public void startLocation(Context context, String strProductName) {
// dlgWait = Tools.createLoadingDialog(this, "定位中,请稍等……");
// dlgWait.show();
mLocationClient = new LocationClient(context);
mLocationClient.registerLocationListener(new MyLocationListenner());
LocationClientOption option = new LocationClientOption();
// 高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 设置是否打开gps,使用gps前提是用户硬件打开gps。默认是不打开gps的。
option.setOpenGps(true);
// 设置坐标类型 返回的定位结果是百度经纬度,默认值gcj02国测局经纬度坐标系
option.setCoorType("bd09ll");
// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setScanSpan(0);
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
//option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
//option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
//setIsNeedLocationPoiList(boolean isNeedLocationPoiList) //设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
option.setIsNeedLocationDescribe(true);//设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近", 可以用作地址信息的补充
// 设置产品线名称:设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
option.setProdName(strProductName);
mLocationClient.setLocOption(option);
//
locationStartDate = new Date();
mLocationClient.start();
}
/**
*
* @类名称:MyLocationListenner
* @类描述: 定位监听类
* @创建人:SQWANG
* @创建时间:2015-2-27 下午12:06:33
* @修改人:
* @修改时间:
* @修改备注:
* @版本:V1.0
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mLocationClient.stop();// 停止定位
locationEndDate = new Date(); // 定位结束时间
if (dlgWait != null && dlgWait.isShowing()) {
dlgWait.dismiss();
}
doLocationResult(location);
}
}
/**
*
* @函数名称: doLocationResult
* @功能描述: 处理定位结果
* @param location
* 定位返回错误码查询:
61 : GPS定位结果,GPS定位成功。
62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者wifi网络是否正常开启,尝试重新请求定位。
63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。
68 : 网络连接失败时,查找本地离线定位时对应的返回结果。
161: 网络定位结果,网络定位定位成功。
162: 请求串密文解析失败。
167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。
502: key参数错误,请按照说明文档重新申请KEY。
505: key不存在或者非法,请按照说明文档重新申请KEY。
601: key服务被开发者自己禁用,请按照说明文档重新申请KEY。
602: key mcode不匹配,您的ak配置过程中安全码设置有问题,请确保:sha1正确,“;”分号是英文状态;
且包名是您当前运行应用的包名,请按照说明文档重新申请KEY。
501~700:key验证失败,请按照说明文档重新申请KEY。
如果不能定位,请记住这个返回值,并到百度LBS开放平台论坛Andriod定位SDK版块中进行交流
http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10 。
若返回值是162~167,请将错误码、imei和定位时间反馈至loc-bugs@baidu.com,
以便我们跟进追查问题。
*/
public void doLocationResult(BDLocation location){
boolean bLocationSuccess = false;
if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果
bLocationSuccess = true;
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果
bLocationSuccess = true;
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
bLocationSuccess = true;
} else if (location.getLocType() == BDLocation.TypeServerError) {
bLocationSuccess = false;
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
bLocationSuccess = false;
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
bLocationSuccess = false;
}
@SuppressWarnings("rawtypes")
HashMap hm = new HashMap();
if (!bLocationSuccess){//定位失败
hm.put("LocationResult", false);
myLocationResultI.doLocationResult(hm);
}else{
hm.put("LocationResult", true);
//不包含地址信息
if (!location.hasAddr()){//仅有经纬度,不包括位置信!
hm.put("IncludeAddr", false);
}else{
hm.put("IncludeAddr", true);
}
// 定位用时,单位毫秒
long locationUsedTime = locationEndDate.getTime() - locationStartDate.getTime();
//
hm.put("Province", location.getProvince());//省
hm.put("City", location.getCity());//市
hm.put("Address", location.getAddress());//街道
hm.put("LocationDescribe", location.getLocationDescribe());//位置语义化信息,ex:"在天安门附近", 可以用作地址信息的补充
hm.put("Longitude", Float.parseFloat(location.getLongitude()+""));//经度
hm.put("Latitude", Float.parseFloat(location.getLatitude()+""));//纬度
hm.put("Radius", location.getRadius());//定位精度
hm.put("LocType", location.getLocType());//定位类型
hm.put("Loctime", locationUsedTime);//定位耗时
myLocationResultI.doLocationResult(hm);
}
}
}
- 导入库文件
- 设置AndroidManifest.xml
- 设置AcessKey
- import相关类
- 功能类的使用
- 需要注意的问题
导入库文件
在相关下载里下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中(建议全部放入以提高程序兼容性),将locSDK_6.X.jar文件拷贝到工程的libs目录下,这样您就可以在程序中使用百度定位SDK了。
使用eclipse开发的开发者,只需要将SO的文件夹放到libs下即可;使用AndroidStutio的开发者除了上述操作,还需要在build.gradle中配置SO的使用,如下所示:
开发者如果开发的是系统应用,则只在工程中配置SO还是不够的,还需要手动把对应架构的SO拷贝到/system/lib下,如果是64位系统的话需要将64位的SO拷贝到/sytem/lib64下。
注意:每次新版本的定位SDK,开发者除了要更新JAR包之外,也要注意一下SO有无更新,如果SO名称不一样了,也要及时替换老的SO版本,不然会导致定位失败!
设置AndroidManifest.xml
在application标签中声明service组件,每个app拥有自己单独的定位service
【重要提醒】
定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。 <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
声明使用权限
设置AcessKey
SDK4.2及之后版本需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入
import相关类
功能类的使用
使用综合定位功能
综合定位功能指的根据用户实际需求,返回用户当前位置的基础定位服务。包含GPS和网络定位(Wi-Fi和基站定位)功能。基本定位功能同时还支持结合定位结果的反地理编码功能,离线定位,位置提醒功能和位置语义化功能。
第一步,初始化LocationClient类
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
LocationClient类是定位SDK的核心类,具体方法详见类参考。
第二步,配置定位SDK参数
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。
LocationClientOption类,该类用来设置定位SDK的定位方式,e.g.:
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。
第三步,实现BDLocationListener接口
BDLocationListener接口有1个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。
BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。具体方法请参考类参考。
获取error code:
返回值:
61 : GPS定位结果,GPS定位成功。
62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者wifi网络是否正常开启,尝试重新请求定位。
63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。
68 : 网络连接失败时,查找本地离线定位时对应的返回结果。
161: 网络定位结果,网络定位定位成功。
162: 请求串密文解析失败。
167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。
502: key参数错误,请按照说明文档重新申请KEY。
505: key不存在或者非法,请按照说明文档重新申请KEY。
601: key服务被开发者自己禁用,请按照说明文档重新申请KEY。
602: key mcode不匹配,您的ak配置过程中安全码设置有问题,请确保:sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请KEY。
501~700:key验证失败,请按照说明文档重新申请KEY。
如果不能定位,请记住这个返回值,并到百度LBS开放平台论坛Andriod定位SDK版块中进行交流http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10 。若返回值是162~167,请将错误码、imei和定位时间反馈至loc-bugs@baidu.com,以便我们跟进追查问题。
第四步,开始定位
开启:
start:启动定位SDK。 stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。
开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop函数即可。
如果stop之后仍然想进行定位,可以再次start等待定位结果回调即可。
如果开发者想按照自己逻辑请求定位,可以在start之后按照自己的逻辑请求locationclient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。
位置提醒使用
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
需要注意的问题
定位SDK必须注册GPS和网络的使用权限。
使用定位SDK请尽量保证网络连接通畅(GPS定位方式不需要连网,但如果需要地址信息、位置语义化、POI等信息都需要联网的)。目前离线功能已经支持获取上述信息,但离线定位不是百分百都能定位成功的,增加我们如何保证在线定位成功的措施,以打消用户对于离线定位的顾虑。
我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
若需要返回的定位结果里包含地址信息,请保证网络连接。因为GPS是本地获取的定位位置,在某些情况下有可能不带地址信息。
定位SDK可以返回bd09、bd09ll、gcj02三种类型坐标,若需要将定位点的位置通过百度Android地图 SDK进行地图展示,请返回bd09ll,将无偏差的叠加在百度地图上。
有的移动设备锁屏后为了省电会自动关闭网络连接,此时网络定位模式的定位失效。此外,锁屏后移动设备若进入cpu休眠,定时定位功能也失效。若您需要实现在cpu休眠状态仍需定时定位,可以用alarmManager 实现1个cpu可叫醒的timer,定时请求定位。
- 百度定位功能封装
- 百度地图v3.5 地图定位和封装定位功能
- 百度地图-定位功能
- 百度附近功能 定位
- 百度地图定位功能
- 百度地图定位功能
- 百度地图 定位功能
- 百度地图定位功能
- 百度定位功能
- 百度SDK定位功能
- 百度地图功能封装
- 百度定位的简单封装
- Android 百度 Map----定位功能
- 百度地图定位功能实例
- 百度地图主动定位功能
- 百度地图主动定位功能
- android 百度地图 定位功能
- 百度地图-html5定位功能
- 编程之美-连连看游戏设计方法整理
- 求两个排序数组的中间值
- 反射
- fedora23安装mysql5.6.27笔记
- PTA 一元多项式的乘法与加法运算
- 百度定位功能封装
- 整数转罗马数字
- 数据结构与算法究竟重要吗?
- Light OJ 1410 - Consistent Verdicts 【排序去重】
- java.lang.IllegalArgumentException: Document base D:\Tomcat 5.0\me-webapps\Tomcat 5.0\me-webapps\Tom
- 线性代数的本质
- Surface Book
- Excel数据插入Mysql数据库可能遇到的问题
- 有关 JDBC 元数据的简单解析