Android集成百度地图(二)定位

第一步,初始化LocationClient类

public LocationClient locationClient = null;  
public BDLocationListener myListener = new MyLocationListener();  
   
public void onCreate() {  
    locationClient = new LocationClient(getApplicationContext());     //声明LocationClient类  
    locationClient.registerLocationListener( myListener );    //注册监听函数  
}  

第二步,配置定位SDK参数

设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);

仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

LocationClientOption类,用来做相应的设置。

        LocationClientOption option = new LocationClientOption();  
        option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备  
        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  返回国测局经纬度坐标系:gcj02 返回百度墨卡托坐标系 :bd09 返回百度经纬度坐标系 :bd09ll
        option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  
        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  
        option.setOpenGps(true);//可选,默认false,设置是否使用gps  
        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  
        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”  
        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到  
        option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死    
        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  
        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  
        locationClient.setLocOption(option);  

第三步,实现BDLocationListener接口

BDLocationListener接口有1个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数

 public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
       
               LatLng latLng = new LatLng(location.getLatitude(),
                        location.getLongitude());
             
        }

    }

第四步,开始定位

 locationClient.start();

最后贴上完整代码:

public class MainActivity extends AppCompatActivity {

   //定位SDK核心类
    private LocationClient locationClient;
    //定位监听
    public MyLocationListenner myListener = new MyLocationListenner();
    //百度地图控件
    private MapView mapView;
    //百度地图对象
    private BaiduMap baiduMap;
    // 是否首次定位
    boolean isFirst = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //该方法注意要在setContentView之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        /**
         * 地图初始化
         */
        //获取百度地图控件
        mapView = (MapView) findViewById(R.id.baiduMapView);
        //获取百度地图对象
        baiduMap = mapView.getMap();
        // 开启定位图层
        baiduMap.setMyLocationEnabled(true);
        /**
         * 定位初始化
         */
        //声明定位SDK核心类
        locationClient = new LocationClient(this);
        //注册监听
        locationClient.registerLocationListener(myListener);
        //定位配置信息
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);//定位请求时间间隔
        locationClient.setLocOption(option);
        //开启定位
        locationClient.start();
    }

    /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mapView == null) {
                return;
            }
            //MyLocationData定位数据
            //MyLocationData.Builder定位数据建造器
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius()) //定位精度
                    .direction(100)                //此处设置开发者获取到的方向信息,顺时针0-360
                    .latitude(location.getLatitude()) //百度纬度坐标
                    .longitude(location.getLongitude()).build(); //百度经度坐标
            baiduMap.setMyLocationData(locData);//设置定位数据, 只有先允许定位图层后设置数据才会生效
            if (isFirst) {
                isFirst = false;
                LatLng latLng = new LatLng(location.getLatitude(),
                        location.getLongitude());
                //定义地图状态
                //MapStatus.Builder地图状态构造器
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(latLng)  //设置地图中心点,为我们的位置
                        .zoom(18.0f);   //设置地图缩放级别
                //animateMapStatus以动画方式更新地图状态,动画耗时 300 ms
                // MapStatusUpdateFactory.newMapStatus设置地图新状态
                baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }

    @Override
    protected void onPause() {
        mapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        // 退出时销毁定位
        locationClient.stop();
        // 关闭定位图层
        baiduMap.setMyLocationEnabled(false);
        mapView.onDestroy();
        mapView = null;
        super.onDestroy();
    }
}

效果如图:


注意:如果你的地图出现一片蓝色,原因是没开启权限的话,坐标为(0,0),经度0和纬度0的交点,大致位于非洲西部的几内亚湾,位于海上,所以是蓝色。设置targetVersion>=23,那么运行到6.0及以上设备时,默认所有权限都不开启,必须动态requestPermission,这里需要位置权限,默认没开启导致此结果,当然你也可以把targetVersion设置在22。


猜你喜欢

转载自blog.csdn.net/hua93/article/details/79680036