文章目录
介绍
该套定位SDK免费对外开放,接口使用无次数限制。在使用前,您需先申请密钥(AK)才可使用
定位原理
使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
环境配置
- 导入库文件(liblocSDK7.so)。
- 添加定位service(AndroidManifest.xml)。
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
<intent-filter>
<action android:name="com.baidu.location.service_v5.0.0"/>
</intent-filter>
</service>
- 添加权限(AndroidManifest.xml)
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
❖定位SDK使用步骤
- 创建定位服务的客户端(LocationClient)。
- 对定位服务客户端进行设置(LocationClientOption)。
- 实现监听接口(BDAbstractLocationListener)。定位监听
- 开启定位服务(LocationClient.start())
Class LocationClient
- 定位服务的客户端类。
LocationClient类必须在主线程中声明,需要Context类型的参数。Context需要是全进程有效的Context,推荐用getApplicationConext获取全进程有效的Context。
public LocationClient mLocationClient = null;
public void onCreate() {
mLocationClient= new LocationClient(getApplicationContext());
}
Class LocationClientOption
- 配置定位SDK参数类。
配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等。
主要的参数有:定位模式、返回坐标类型、是否打开GPS等。
❖ 定位模式分为三种:
- 高精度定位模式:同时使用网络定位和GPS定位,优先返回最高精度的定位结果。
- 低功耗定位模式:不使用GPS,只使用网络定位(WiFi和基站)。
- 仅用设备定位模式: 不使用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。
配置定位SDK参数类
❖ 坐标类型:
➢ 国测局经纬度坐标系: “gcj02”
➢ 百度墨卡托坐标系:“bd09”
➢ 百度经纬度坐标系:“bd09ll”
#####GPS:wgs84
❖ 定位模式:
➢ 高精度定位模式:Hight_Accuracy
➢ 低功耗定位模式:Battery_Saving
➢ 仅用设备定位模式: Device_Sensors
// 设置定位的相关配置
LocationClientOption option= new LocationClientOption();
option.setOpenGps(true); // 打开GPS
option.setCoorType("bd09ll"); // 坐标类型
option.setScanSpan(1000); // 扫描间隔
// 定位模式
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 通过配置参数对定位客户端进行设置
mLocationClient.setLocOption(option);
实现定位请求回调接口(BDLocationListener)
// 定位服务客户端设置回调接口
locationClient.registerLocationListener(locationListener);
class MyLocationListener extends BDAbstractLocationListener{
// 异步返回的定位结果
@Override
public void onReceiveLocation(BDLocation location) {
// 处理定位信息
}
}
❖Class BDLocation 回调的百度坐标类。
此时可以完成了一个基本的地图定位功能。如果要显示在地图上,就像百度那样出现一个点表示地图的定位点,就需要用到下面两个类:
➢MyLocationConfiguration(配置定位图层显示方式)
➢MylocationData(定位数据)。
❖Class MyLocationConfiguration
- 配置定位图层显示方式类。
通过BaiduMap.setMyLocationConfigeration()方法设置定位图层信息。
public MyLocationConfiguration(MyLocationConfiguration.LocationMode mode,
boolean enableDirection,
BitmapDescriptor customMarker)
参数:
mode - 定位图层显示方式, 默认为 LocationMode.NORMAL 普通态
enableDirection - 是否允许显示方向信息
customMarker - 设置用户自定义定位图标,可以为 null
❖定位图层显示方式:
➢ MyLocationConfiguration.LocationMode.COMPASS罗盘态,显示定位方向圈,保持定位图标在地图中心
➢ MyLocationConfiguration.LocationMode.FOLLOWING跟随态,保持定位图标在地图中心
➢ MyLocationConfiguration.LocationMode.NORMAL普通态: 更新定位数据时不对地图做任何操作
Class MyLocationData
- 定位数据类,MyLocationData包含一个内部类Builder用于构建对象
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(radius) // 精度
.direction(direction)// 方向
.latitude(latitude) // 纬度
.longitude(longitude)// 经度
.build(); // 构建生成定位数据对象
// 通过BaiduMap.setMyLocationData()设置定位数据
bdMap.setMyLocationData(locData);
通过定位的onReceiveLocation()方法可以得到定位的经纬度,然后可以通过animateMapStatus()方法把定位到的点移动到地图中心
LatLng ll = new LatLng(mCurrentLantitude,mCurrentLongitude);
MapStatusUpdate u= MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
开启定位
❖通过定位服务客户端的start()函数来开启定位服务,通过stop()函数来关闭定位服务。❖因为定位也是比较耗电的,所以通常我们在Activity 的onStart中开启定位,在onStop中关闭定位,这样应用最小化时就不会一直进行GPS请求定位了。
protected void onStart() {
mBaiduMap.setMyLocationEnabled(true); // 开启图层定位
if (!mLocationClient.isStarted()) {
mLocationClient.start();
}
super.onStart();
}
protected void onStop() {
mBaiduMap.setMyLocationEnabled(false); // 关闭图层定位
mLocationClient.stop();
super.onStop();
}