Android使⽤百度定位SDK⽅法及错误处理
之前我的项⽬中的位置定位使⽤的是⽅法,使⽤的Google提供的API,但是前天中午突然就不返回数据了,到⽹上搜了⼀下才知
道,Google的接⼝不提供服务了,基于时间紧迫⽤了百度现有的SDK,但是在使⽤过程中第⼀次获取位置总是空值,经过多次实验终于成功。当然,如果需要精确的位置,你可以再加上位置偏移算法。我的应⽤对这个要求不⾼,就没做,⼀搜⼀⼤把,就不多说了。
下⾯这段话来⾃百度地图API>定位SDK
百度地图定位SDK免费对外开放,⽆需申请key。在使⽤百度定位SDK前,希望先阅读百度定位地图的API。如果使⽤则被视为对使⽤条款的完全接收,并同意接收本协议的各项条款约束。
⽬前百度地图定位SDK只⽀持Android和Symbian量⼤平台,其他产品正在开放中。
下⾯事例是使⽤Android平台的部分代码。对于这个平台百度的开放⼈员已经写了完整的demo,把⼯程导⼊到eclipse中之后⼀般没有错误,如果报错的话,eclipse也会给出提⽰。⼀般可以通过将propertie.properties⽂件名字改为default.properties就可以了,如果还有错误的话,显⽰⼯程activity错误啊什么的,就是SDK版本不对的问题了,你可以通过他的manifest⽂件查看<uses-sdk android:minSdkV
ersion="8" />到这个最⼩值,⽐如我下载的是2.6他的最低版本是5,我eclipse默认版本是8,就可以同过右键单击该⼯程,选择最下⾯那个properties 项,然后在弹出对话框的右侧列表中选择Android,在左侧选择API level为5,也就是2.0,然后确定。就⽊有问题了。
下⾯说⼀下使⽤该API的具体步骤:
也可以查看百度定位SDK⾃⼰的开发指南
1、⾸先第⼀步就是搭配环境:
①先将百度demo中的libs⽂件夹复制到⾃⼰的⼯程。(别忘记把jar包build path)
②然后复制
<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote" android:permission="android.permission.BAIDU_LOCATION_SERVICE">
<intent-filter>
<action android:name="com.baidu.location.service_v2.6"></action>
</intent-filter>
</service>
到manifest的application 节点
接下来复制百度地位SDK需要的permission
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
<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" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
</uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
③接下来就可以在代码中放⼼的使⽤百度定位SDK了.
下⾯是来⾃百度的提醒.需要注意的是第五条,因为我们第⼀次经常定位不到位置:
1、您需要确保程序编译通过。如果对⾃⼰写的代码有疑问,可以下载官⽅⾼级⽰例,查看标准源代码。
2、请确保⽹络通畅,⽆论是连接wifi还是使⽤2G/3G信号。
3、定位SDK的调⽤必须在主线程中。
4、必须在定位SDK启动前设定好参数,例如是否使⽤GPS,扫描时间间隔设置等。我们强烈建议您设置⾃⼰的prodName,并保管好,这样⽅便我们为您提供更好的定位服务。
5、定位SDK start之后⽴即执⾏,这种情况下很难定位成功,因为定位SDK刚开始启动还没有获取到定位信息。这时getlocation⼀般为null。如果是要获取位置成功,可以在listerner中添加⼀个判断如果strData为空,则再发起⼀次定位。
6、定位覆盖率⼤概在98%。就是说有2%可能服务器没有数据,所以定位会失败。只需要⾛到别的地⽅,或者多试⼏次即可成功定位。
7、请使⽤真机。在虚拟机上⽆法进⾏定位测试。
下⾯就是我的事例代码:
具体思路是:将开启和获取位置的代码分开来做,可以在程序刚开启的时候就start。因为据上⾯所说,有时候可能两分钟才能获取到位置,对于我们需要展⽰信息来说,这是绝对不可以的。如果在主线程卡两分钟后果可想⽽知的。
需要说名的是:我这⾥没有设置时间间隔public void setScanSpan ( int ) //设置定时定位的时间间隔。单位ms,如果不设置或者所设置的整数值⼩于1000(ms)时,采⽤第⼀次定位模式。每调⽤⼀次requestLocatin(),定位SDK会发起⼀次定位。请求定位与监听结果⼀⼀对应;如果所设的整数值⼤于等于1000(ms)时,定位SDK内部使⽤定时定位模式。调⽤requestLocation( )后,每隔设定的时间,
定位SDK就会进⾏⼀次定位。如果定位SDK根据定位依据发现位置没有发⽣变化,就不会发起⽹络请求,返回上⼀次定位的结果;如果发现位置改变,就进⾏⽹络请求进⾏定位,得到新的定位结果。定时定位时,调⽤⼀次requestLocation,会定时监听到定位结果。设定了定时定位后,可以热切换成⼀次定位,需要重新设置时间间隔⼩于1000(ms)即可。locationClient对象stop后,将不再进⾏定位。如果设定了定时定位模式后,多次调⽤requestLocation(),则是每隔⼀段时间进⾏⼀次定位,同时额外的定位请求也会进⾏定位,但频率不会超过1秒⼀次。
t.Context;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import ity.LocationInfo.SItude;
import com.palmdeal.util.Logger;
public class LocationProvider {
private static LocationClient mLocationClient = null;
private static SItude station = new SItude();
private static MyBDListener listener = new MyBDListener();
Context context;
public LocationProvider(Context context) {
super();
}
public void startLocation() {
mLocationClient = new LocationClient(context);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型为bd09ll
option.setPriority(LocationClientOption.NetWorkFirst); // 设置⽹络优先
option.setProdName("demo"); // 设置产品线名称
mLocationClient.setLocOption(option);
mLocationClient.start();//将开启与获取位置分开,就可以尽量的在后⾯的使⽤中获取到位置
}
/**
* 停⽌,减少资源消耗
*/
public void stopListener() {
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.stop();
mLocationClient = null;
}
}
/**
* 更新位置并保存到SItude中
*/
public void updateListener() {
if (mLocationClient != null && mLocationClient.isStarted()) {
Logger.i("update the location");
}
}
/**
* 获取经纬度信息
*
* @return
*/
public SItude getLocation() {安卓intent用法
return station;
}
private static class MyBDListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (City() == null) {
int type = questLocation();
Logger.e("first request false" + type);
}
station.latitude = Latitude();
station.longitude = Longitude();
}
@Override
public void onReceivePoi(BDLocation arg0) {
// return
}
}
}
public class LocationInfo {
/** 经纬度信息结构体 */
public static class SItude {
/** 纬度 */
public double latitude;
/** 经度 */
public double longitude;
}
}
在使⽤的时候,在⼀开始就开启LocationClient,即调⽤startLocation()⽅法。我的是在服务服务中的onCreate中调⽤的,然后在代码中这样使⽤:
LocationInfo.SItude station = Location();
if (station.latitude == 0.0 && station.longitude == 0.0) {
location.updateListener();
station = Location();
}
if (station.latitude == 0.0 && station.longitude == 0.0) {
return "未定位到您现在的位置,请重试";
}
location.stopListener();
使⽤上⾯的⽅法后,第⼀次使⽤都能拿到位置信息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论