百度地图最新版本sdk使用系列(五)-定位功能的实现

定位功能的核心类是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

你可能感兴趣的:(Android开发,百度地图)