百度地图之定位

来源:互联网 发布:机器人技术基础知乎 编辑:程序博客网 时间:2024/05/17 07:10
package com.demo.map;import android.Manifest;import android.content.pm.PackageManager;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.Button;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.model.LatLng;public class MainActivity extends AppCompatActivity{    //地图相关    /**     * 百度地图控件     */    MapView mMapView=null;    /**     * 百度地图实例     */    BaiduMap mBaidumap=null;    //定位相关    /**     * 定位客户端     */    LocationClient mLocClient;    /**     * 定位模式     */    private LocationMode mCurrentMode;    /**     * 定位图标     */    BitmapDescriptor mCurrentMarker;    /**     * 传感器管理器     */    private SensorManager mSensorManager;    /**     * 当前方向     */    private int mCurrentDirection=0;    /**     * 当前经度     */    private double mCurrentLat=0.0;    /**     * 当前纬度     */    private double mCurrentLon=0.0;    /**     * 当前经度     */    private float mCurrentAccracy;    /**     * 是否首次定位     */    boolean isFirstLoc=true;    /**     * 定位数据     */    private MyLocationData locData;    /**     * 定位监听     */    private MyLocationListener myListener=new MyLocationListener();    /**     * 方向监听     */    private DirectionSensorListener DirectionListener=new DirectionSensorListener();    /**     * 上一次的方向     */    private Double lastX=0.0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_main);        mSensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);//获取传感器管理服务        mCurrentMode= LocationMode.NORMAL;        //初始化地图        mMapView= (MapView) findViewById(R.id.map);        mBaidumap=mMapView.getMap();        //开启定位图层        mBaidumap.setMyLocationEnabled(true);        //定位初始化        mLocClient=new LocationClient(this);        mLocClient.registerLocationListener(myListener);        LocationClientOption option=new LocationClientOption();        option.setOpenGps(true);//打开GPS        option.setCoorType("bd09ll");//设置坐标类型        option.setIsNeedAddress(true);//是否需要地址信息        option.setScanSpan(1000);        LocationPermission();        mLocClient.setLocOption(option);    }    /**     * 获取GPS定位权限(Android6.0 以上需要动态获取权限)     */    private void LocationPermission() {        int checkPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION);        if (checkPermission != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);            Log.d("未获得定位权限", "弹出提示");            return;        }    }    /**     * 方向监听     */    public class DirectionSensorListener implements SensorEventListener{        @Override        public void onSensorChanged(SensorEvent event) {            double x=event.values[SensorManager.DATA_X];            if(Math.abs(x-lastX)>1.0){                mCurrentDirection= (int) x;                //设置定位数据                locData=new MyLocationData.Builder()                        .accuracy(mCurrentAccracy)//精度                        .direction(mCurrentDirection) //此处设置开发者获取到的方向信息,顺时针0-360                        .latitude(mCurrentLat)//经度                        .longitude(mCurrentLon)//纬度                        .build();                mBaidumap.setMyLocationData(locData);            }            lastX=x;        }        @Override        public void onAccuracyChanged(Sensor sensor, int accuracy) {        }    }    /**     * 定位监听     */    public class MyLocationListener implements BDLocationListener{        @Override        public void onReceiveLocation(BDLocation bdLocation) {            //map view销毁后不在处理新接受的位置            if(bdLocation==null||mMapView==null)            {                return;            }            mCurrentLat=bdLocation.getLatitude();            mCurrentLon=bdLocation.getLongitude();            mCurrentAccracy=bdLocation.getRadius();            //设置定位数据            locData=new MyLocationData.Builder()                    .accuracy(bdLocation.getRadius())//精度                    .direction(mCurrentDirection) //此处设置开发者获取到的方向信息,顺时针0-360                    .latitude(bdLocation.getLatitude())//经度                    .longitude(bdLocation.getLongitude())//纬度                    .build();            mBaidumap.setMyLocationData(locData);            //第一次定位时,将地图位置移动到当前位置            if(isFirstLoc){                isFirstLoc=false;                LatLng ll=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());                MapStatus.Builder builder=new MapStatus.Builder();                builder.target(ll).zoom(18.0f);                mBaidumap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));                mCurrentMarker = null;                mBaidumap                        .setMyLocationConfiguration(new MyLocationConfiguration(                                mCurrentMode, true, null));            }        }    }    //生命周期    @Override    protected void onStart() {        //为系统的方向传感器注册监听器        mSensorManager.registerListener(DirectionListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)                ,SensorManager.SENSOR_DELAY_UI);        //启动监听        mLocClient.start();        super.onStart();    }    @Override    protected void onPause() {        mMapView.onPause();        super.onPause();    }    @Override    protected void onResume() {        mMapView.onResume();        super.onResume();    }    @Override    protected void onStop() {        //取消传感器监听        mSensorManager.unregisterListener(DirectionListener);        super.onStop();    }    @Override    protected void onDestroy() {        //退出时销毁定位        mLocClient.stop();        //关闭定位图层        mBaidumap.setMyLocationEnabled(false);        mMapView.onDestroy();        mMapView=null;        super.onDestroy();    }}

1、在定位监听(MyLocationListener)的回调函数中设置定位的数据
2、在传感器监听(DirectionSensorListener)的回调函数中设置方向数据。
3、需要注意的是 Android6.0以上版本,部分权限除了需要在配置清单文件中添加权限之外,还需要动态的获取权限

原创粉丝点击