定位功能的核心类是LocationClient和一个回调接口BDLocationListener.
从百度服务器拿到的定位数据(经纬度等)就封装在回调方法onReceiveLocation(BDLocation location)的参数location里面,
我们只需要将其取出展示在map上即可.
详细代码如下:
public class MainActivity extends Activity {
private MapView mMapView;// 地图视图
private BaiduMap mBaiduMap;// 地图控制器 setMapStatus(mMapStatusUpdate);
private MapStatus mMapStatus;// 地图当前状态
private MapStatusUpdate mMapStatusUpdate;// 地图将要变化成的状态
private Button btn_test;// 测试button
public LocationClient mLocationClient = null;// 定位的核心类:LocationClient
public BDLocationListener myListener = new MyLocationListener();// 定位的回调接口
private LatLng mCurrentLatLng;// 当前经纬度坐标
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 该方法要在setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
init();
// 设置是否允许定位图层,只有先允许定位图层后设置定位数据才会生效
mBaiduMap.setMyLocationEnabled(true);
btn_test.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
location();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 开启卫星图
// 获得地图的当前状态的信息
mMapStatus = new MapStatus.Builder().zoom(18).target(mCurrentLatLng).build();
// 设置地图将要变成的状态
mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);// 设置地图的变化
}
});
}
private void init() {
// 获得地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
// 获得地图控制器
mBaiduMap = mMapView.getMap();// MapView与BaiduMap一一对应
// 定位核心类
mLocationClient = new LocationClient(getApplicationContext());
// 定位回调接口
myListener = new MyLocationListener();
// 测试按钮
btn_test = (Button) findViewById(R.id.test);
}
/**
* 定位
*/
private void location() {
// 设置mLocationClient数据,如是否打开GPS,使用LocationClientOption类.
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
option.setOpenGps(true);// 打开GPS
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(myListener);
}
@Override
protected void onStart() {
location();
mLocationClient.start();// 开启定位请求
super.onStart();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mLocationClient.stop();// 停止定位
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// mapView 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
//获取服务器回传的当前经纬度
mCurrentLatLng = new LatLng(location.getLatitude(),
location.getLongitude());
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())// 获取定位精度
.latitude(location.getLatitude())// 获取纬度坐标
.longitude(location.getLongitude())// 获取精度坐标
.build();
mBaiduMap.setMyLocationData(locData);// 设置定位数据
}
}
}
此demo已上传csdn,下载地址为:
http://download.csdn.net/detail/csdn1027719307/8700107