【经验小谈】百度定位api使用 百度定位demo 百度地图快速定位 百度地图获取当前位置 获取自己的位置 百度定位示例

开发指南v4.1

1. 导入库文件

相关下载最新的库文件。将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.1.jar文件拷贝到工程的libs目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定locSDK4.1.jar,确定后返回。这样您就可以在程序中使用百度地理围栏SDK了。

2. 设置AndroidManifest.xml

2.1. 在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>


2.2 声明使用权限
<!-- 这个权限用于进行网络定位-->
<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>
<!-- 允许应用读取低级别的系统日志文件-->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>


2.3 import相关类
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
//如果使用地理围栏功能,需要import如下类
import com.baidu.location.BDGeofence;
import com.baidu.location.BDLocationStatusCodes;
import com.baidu.location.GeofenceClient;
import com.baidu.location.GeofenceClient.OnAddBDGeofencesResultListener;
import com.baidu.location.GeofenceClient.OnGeofenceTriggerListener;
import com.baidu.location.GeofenceClient.OnRemoveBDGeofencesResultListener;


3. 功能类的使用

3.1. 使用基本定位功能

基本定位功能指的根据用户实际需求,返回用户当前位置的基础定位服务。包含GPS和网络定位(Wi-Fi和基站定位)功能。基本定位功能同时还支持结合定位结果的反地理编码功能,离线定位,周边POI查询和位置提醒功能。

3.1.1. 初始化LocationClient类

此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。

Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context

public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
 
public void onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
    mLocationClient.registerLocationListener( myListener );    //注册监听函数
}


3.1.2 实现BDLocationListener接口

BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。

public class MyLocationListener implements BDLocationListener {
    @Override
   public void onReceiveLocation(BDLocation location) {
      if (location == null)
          return ;
      StringBuffer sb = new StringBuffer(256);
      sb.append("time : ");
      sb.append(location.getTime());
      sb.append("\nerror code : ");
      sb.append(location.getLocType());
      sb.append("\nlatitude : ");
      sb.append(location.getLatitude());
      sb.append("\nlontitude : ");
      sb.append(location.getLongitude());
      sb.append("\nradius : ");
      sb.append(location.getRadius());
      if (location.getLocType() == BDLocation.TypeGpsLocation){
           sb.append("\nspeed : ");
           sb.append(location.getSpeed());
           sb.append("\nsatellite : ");
           sb.append(location.getSatelliteNumber());
           } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
           sb.append("\naddr : ");
           sb.append(location.getAddrStr());
        } 
 
      logMsg(sb.toString());
    }
public void onReceivePoi(BDLocation poiLocation) {
//将在下个版本中去除poi功能
         if (poiLocation == null){
                return ;
          }
         StringBuffer sb = new StringBuffer(256);
          sb.append("Poi time : ");
          sb.append(poiLocation.getTime());
          sb.append("\nerror code : ");
          sb.append(poiLocation.getLocType());
          sb.append("\nlatitude : ");
          sb.append(poiLocation.getLatitude());
          sb.append("\nlontitude : ");
          sb.append(poiLocation.getLongitude());
          sb.append("\nradius : ");
          sb.append(poiLocation.getRadius());
          if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){
              sb.append("\naddr : ");
              sb.append(poiLocation.getAddrStr());
         } 
          if(poiLocation.hasPoi()){
               sb.append("\nPoi:");
               sb.append(poiLocation.getPoi());
         }else{             
               sb.append("noPoi information");
          }
         logMsg(sb.toString());
        }
}


BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。具体方法如下:

获取error code:

  • 61 : GPS定位结果
  • 62 : 扫描整合定位依据失败。此时定位结果无效。
  • 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
  • 65 : 定位缓存的结果。
  • 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
  • 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
  • 68 : 网络连接失败时,查找本地离线定位时对应的返回结果
  • 161: 表示网络定位结果
  • 162~167: 服务端定位失败
  • 502:key参数错误
  • 505:key不存在或者非法
  • 601:key服务被开发者自己禁用
  • 602:key mcode不匹配
  • 501~700:key验证失败

如果不能定位,请记住这个返回值,并到我们的hi群或者贴吧中交流。若返回值是162~167,请发送邮件至mapapi@baidu.com反馈。

3.1.3 设置定位参数

设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS等等。

高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);

仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

eg:

LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanType(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
mLocClient.setLocOption(option);


3.1.4 发起定位请求

发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。

if (mLocClient != null && mLocClient.isStarted())
  mLocClient.requestLocation();
else 
 Log.d("LocSDK3", "locClient is null or not started");


3.1.5 发起POI查询请求

发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取。

if (mLocClient != null && mLocClient.isStarted())
  mLocClient.requestPoi();


3.1.6 发起离线定位请求

发起离线定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。

getLocTypte = BDLocation.TypteOfflineLocation || BDLocation.TypeOfflineLocationFail

表示是离线定位请求返回的定位结果

if (mLocClient != null && mLocClient.isStarted())
  mLocClient.requestOfflineLocation();


3.1.7 位置提醒使用

位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。

//位置提醒相关代码
mNotifyer = new NotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。

//BDNotifyListner实现
public class NotifyLister extends BDNotifyListener{
    public void onNotify(BDLocation mlocation, float distance){
    mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
    }
}

//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);


3.2 使用地理围栏服务Beta

地理围栏服务提供的是基于位置的提醒服务,相对于SDK原来提供的位置提醒功能,地理围栏服务通过SDK本身的内部逻辑,大幅度降低位置提醒服务的功耗情况。通过使用地理围栏服务,第三方APP可以在低能耗的模式下轻松实现位置提醒服务。

3.2.1 初始化GeofecenClient类

此处需要注意:GeofenceClient类必须在主线程中声明。需要Context类型的参数。

// Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context。

public GeofenceClient mGeofenceClient =null;

public void onCreate() {
    mGeofenceClient = new GeofenceClient(getApplicationContext());     //声明GeofenceClient类
}


3.2.2 实现添加和删除围栏的回调接口

添加围栏回调:OnAddBDGeofencesResultListener

实现如下:

public class AddGeofenceListener implements OnAddBDGeofencesResultListener {
    @Override
  public void onAddBDGeofencesResult(int statusCode, String geofenceRequestId) {
      if (statusCode == BDLocationStatusCodes.SUCCESS){
          //围栏创建成功
}}}


删除围栏回调:OnRemoveBDGeofencesResultListener

实现如下:

public class RemoveFenceListener implements OnRemoveBDGeofencesResultListener {
    @Override
  public void onRemoveBDGeofencesByRequestIdsResult(int statusCode, String[] geofenceRequestIds) {
      if (statusCode == BDLocationStatusCodes.SUCCESS){
          //围栏删除成功
}}}

3.2.3 实现并注册OnGeofenceTriggerListener回调接口
public class GeofenceEnterLister implements OnGeofenceTriggerListener {
    @Override
  public void onGeofenceTrigger(String geofenceRequestId) {
          //进入围栏,围栏Id = geofenceRequestId
}
          //注册并开启围栏扫描服务
 mGeofenceClient.registerGeofenceTriggerListener(new GeofenceEnterLister());
 mGeofenceClient.start();
}


3.2.4 设置围栏参数

围栏参数包括:id:围栏Id、x,y:围栏坐标点经纬度、name:半径类型(RADIUS_TYPE_SMALL、RADIUS_TYPE_MIDDELE、RADIUS_TYPE_LARGE)、expir:围栏的有效时间,单位毫秒(最长可以设置1个月)、coordType:坐标类型(COORD_TYPE_BD09、COORD_TYPE_BD09LL、COORD_TYPE_GCJ)

具体如下:

BDGeofence fence = new BDGeofenceBuilder().setGeofenceId(id).
           setCircularRegion(x, y, type)
           .setExpirationDruation(expir)
           .setCoordType(coordType)
           .build();


3.2.5 发起围栏添加和删除请求
//添加一个围栏
mGeofenceClient.addBDGeofence(fence, new AddGeofenceListener());
//删除,指定要删除围栏的名字列表
List<String> fences= new ArrayList<String>();
fences.add(fenceId);
mGeofenceClient.removeBDGeofences(fence, new RemoveFenceListener());


4. 需要注意的问题

  • 定位SDK必须注册GPS和网络的使用权限。
  • 使用定位SDK请保证网络连接通畅(GPS定位方式不需要连网)。
  • 我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
  • 若需要返回的定位结果里包含地址信息,请保证网络连接。
  • 定位SDK可以返回bd09、bd09ll、gcj02三种类型坐标,若需要将定位点的位置通过百度Android地图 SDK进行地图展示,请返回bd09ll,将无偏差的叠加在百度地图上。
  • 有的移动设备锁屏后为了省电会自动关闭网络连接,此时网络定位模式的定位失效。此外,锁屏后移动设备若进入cpu休眠,定时定位功能也失效。若您需要实现在cpu休眠状态仍需定时定位,可以用alarmManager 实现1个cpu可叫醒的timer,定时请求定位。
  • 使用SDK4.1需要设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
  • 设置AccessKey,在application标签中加入
  
  
  1. <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="key"/> //key:开发者申请的key
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值