定位是地图开发的必经重要的环节,我也在不断学习中,就自己了解写一下这些。
一、配置
1.百度的定位是有自己jar包和so文件的,所以记得将它们配置到对应的文件夹中并加载进工程里。具加载方法在学习一里面就有了,这里就不细讲了。
2.在百度的配置方法中导入完库文件后,还要进行声明libs源文件
如果是将jar包和so文件全部放入libs文件中,就需要这样的声明了,本人也试过,但是格式有点偏差,build.gradle会报错,改成下面这样就可以了。
sourceSets {
main {
jniLibs.srcDir 'libs'
}
3.添加service
location的服务是作为service来开启的,需要添加进AndroidMainfest.xml。
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
4.添加权限
之前学习一中已经把后续的所需权限包含进来,所以可以参考之前的,这里就不附上了。
二、熟悉主要的使用的定位的类
1.LocationClient
这是一个定位服务的类,相当于定义一个有定位服务的客户端,而且只能在主线程中启动
它的有两个构造函数,都需要传入全局的context,建议用getApplicationContext传入
这两个构造函数区别:是否在创建过程中之前是否定义了配置定位参数的locationClientOption。如果采用第一个构造方法,那么在后面也需要使用setLocOption来补充。
常用方法如下:
void | setLocOption(LocationClientOption locOption) |
设置 LocationClientOption |
void | start() |
启动定位sdk |
void | stop() |
停止定位sdk |
void | registerLocationListener(BDLocationListener listener) |
注册定位监听函数 |
void | registerNotify(BDNotifyListener mNotify) |
注册位置提醒监听 |
void | requestNotifyLocation() |
NA |
void | removeNotifyEvent(BDNotifyListener mNotify) |
取消注册的位置提醒监听 |
int | requestOfflineLocation() |
离线定位请求,异步返回,结果在locationListener中获取. |
一般在构造完和设置参数后吗,就可以调用start方法,启动定位服务。
2.LocationClientOption
能够配置定位SDK各种参数
常用的方法:
void | setCoorType(java.lang.String coorType) |
获得当前设置的坐标类型 |
void | SetIgnoreCacheException(boolean cacheException) |
设置是否进行异常捕捉 true:不捕捉异常;false:捕捉异常,默认为false |
void | setIgnoreKillProcess(boolean killProcess) |
设置是否退出定位进程 true:不退出进程; false:退出进程,默认为true |
void | setIsNeedAddress(boolean isNeed) |
设置是否需要地址信息,默认为无地址 |
void | setIsNeedLocationPoiList(boolean isNeedLocationPoiList) |
设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据 |
void | setLocationMode(LocationClientOption.LocationMode mode) |
设置定位模式 |
void | setNeedDeviceDirect (boolean isNeedDeviceDirect) |
在网络定位时,是否需要设备方向 true:需要 ; false:不需要。 |
void | setOpenGps(boolean openGps) |
设置是否打开gps进行定位 |
void | setProdName(java.lang.String prodName) |
设置Prod字段值 |
void | setScanSpan(int scanSpan) |
设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效 |
常用的设置有定位模式、定位坐标系、扫描时间间隔、返回地址结果、是否打开GPS、定位模式。
定位模式(默认高精度):
(1)高精度定位模式(Hight_Accuracy):同时使用网络定位和GPS定位,优先返回最高精度的定位结果。
(2) 低功耗定位模式(Battery_Saving):不使用GPS,只使用网络定位(WiFi和基站)。
(3)仅用设备定位模式(Device_Sensors): 不适用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。
定位坐标系(建议采用bd09ll,百度地图用自己坐标比较准。。。):
(1)返回国测局经纬度坐标系:gcj02
(2)返回百度墨卡托坐标系 :bd09
(3)返回百度经纬度坐标系 :bd09ll
关于坐标系的一些了解我也会在下一篇blog里面说到。。。
扫描时间间隔(单位:ms):设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
返回定位结果:设置是否需要地址信息,默认无地址
是否打开GPS:定位一般都需要开启
3. BDLocationListener 定位请求回调接口
在设置完定位参数过后,需要设置监听事件,主要是重写onReceiveLocation(BDLocation location)函数,实现对于location结果的处理。
4.BDLocation 内部封装了经纬度、半径等属性。
常用的方法:
java.lang.String |
getAddrStr() |
获取详细地址信息 |
double |
getAltitude() |
获取高度信息,目前只有是GPS定位结果时才有效,单位米(还没有实现) |
java.lang.String |
getCity() |
获取城市 |
java.lang.String |
getCountry() |
获取国家 |
double |
getLatitude() |
获取纬度坐标 |
double |
getLongitude() |
获取经度坐标 |
java.lang.String |
getProvince() |
获取省份 |
float |
getSpeed() |
获取速度,仅gps定位结果时有速度信息,单位公里/小时,默认值0.0f |
java.lang.String |
getStreet() |
获取街道信息 |
java.lang.String |
getTime() |
server返回的当前定位时间 |
|
|
获取定位精度,默认值0.0f |
|
|
gps定位结果时,行进的方向,单位度 |
常获取的信息:经纬度、精度范围、行进的方向
5.MyLocationData 定位数据包
之前的类完成地图的定位和监听响应,如果要在地图中显示出来,就需要构造定位数据包,来显示当前定位位置。
MyLocationData.Builder |
accuracy(float accuracy) |
设置定位数据的精度信息,单位:米 |
MyLocationData |
build() |
构建生成定位数据对象 |
MyLocationData.Builder |
direction(float direction) |
设置定位数据的方向信息 |
MyLocationData.Builder |
latitude(double lat) |
设置定位数据的纬度 |
MyLocationData.Builder |
longitude(double lng) |
设置定位数据的经度 |
MyLocationData.Builder |
satellitesNum(int num) |
设置定位数据的卫星数目 |
MyLocationData.Builder |
speed(float speed) |
设置定位数据的速度 |
这些方法常用的就是精度、经纬度、方向,对应数据获取可以BDLocation的方法获取。
6.MyLocationConfiguration 配置定位图层
构造函数MyLocationConfiguration(MyLocationConfiguration.LocationMode mode, boolean enableDirection, BitmapDescriptor customMarker)
显示方式(LocationMode):
有了上面几个基本的类就能简单的使用定位服务啦。
还有什么类需要查找的也可以到官网去搜索
http://wiki.lbsyun.baidu.com/cms/androidloc/doc/v6_0_3/doc/index.html
核心的代码附上:
mLocClient = new LocationClient(this);//定义定位客户端
mLocClient.registerLocationListener(myListener);//设置监听事件
LocationClientOption option = new LocationClientOption();//设置参数
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//设施扫描间隔时间
mLocClient.setLocOption(option);//将参数添加进客户端
mLocClient.start();//开启客户端
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
//mToast = Toast.makeText(LocationDemo.this, "第一次位置:"+ll.latitude +"|"+ ll.longitude, Toast.LENGTH_SHORT);
//mToast.show();
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}