按照百度地图官网提供的API,前面完成了所谓的hello map的完成,现在要说的是接下来的一个功能,定位功能
初始化定位相关代码
/**
* 初始化定位相关代码
*/
private void initLocation() {
mLocationClient = new LocationClient(this);
mLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
if (mLocationClient != null && !mLocationClient.isStarted()) {
mLocationClient.requestLocation();
mLocationClient.start();
}
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);// 设置定位模式
option.setOpenGps(true);
option.setCoorType("bd09ll");// 设置坐标类型,返回的定位结果是百度经纬度,默认值gcj02
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
option.setScanSpan(1000);// 每过1000毫秒进行一次请求。
mLocationClient.setLocOption(option);
}
2.定位的监听器
/**
* 实现实位回调监听
*/
private class MyLocationListener implements BDLocationListener {
/**
* 定位成功以后的回调
*/
@Override
public void onReceiveLocation(BDLocation location) {
MyLocationData data = new MyLocationData.Builder()//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
// 设置定位数据
mBaiduMap.setMyLocationData(data);
mLatitude = location.getLatitude();
mLongtitude = location.getLongitude();
// 第一次定位时,将地图位置移动到当前位置
if (isFirstIn) {
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
isFirstIn = false;
//吐司
Toast.makeText(MainActivity.this, location.getAddrStr(), 10)
.show();
}
}
其次定位这个功能,是非常消耗电量的,为了用户体验考虑。在onStart中开启定位,在onStop中关闭定位~~这样应用最小化时就不会一直在哪GPS请求定位了,、
@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
/**
* 开启定位
*/
mBaiduMap.setMyLocationEnabled(true);
if (mLocationClient.isStarted())
mLocationClient.start();
}
@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
/**
* 停止定位
*/
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
必须在AndroidManifest.xml配一个service
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
定位的核心代码
/**
* 定位到我的位置
* 地图移动到我的位置,此处可以重新发定位请求,然后定位;
* 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好
*
*/
private void centerToMyLocation() {
LatLng latLng = new LatLng(mLatitude, mLongtitude);
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
}