BaiduMap初体验(三) 使用百度地图定位功能

来源:互联网 发布:关闭计算机的8080端口 编辑:程序博客网 时间:2024/06/08 21:04

上一篇文章简单介绍了百度地图相关类的知识,让大家对百度地图的相关类有一定的了解,这篇文章带领大家去学习如何使用百度地图定位的功能。
上一篇:BaiduMap初体验(二) 认识百度地图常用类

定位开始

在 BaiduMap初体验(一) 搭建百度地图的环境介绍了百度地图的详细配置,这里可以跳过。
定位功能实现大概分为4个步骤

1.添加使用相关权限。

 <!-- 这个权限用于进行网络定位-->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>    <!-- 这个权限用于访问GPS定位-->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>    <!-- 用于读取手机当前的状态-->    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>    <!-- SD卡读取权限,用户写入离线定位数据-->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

2.注册百度地图定位的服务。

 <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >            <intent-filter>                <action android:name="com.baidu.location.service_v2.2" >                </action>            </intent-filter>        </service>

3.构建地图定位的客户端

public class LocationApplication extends Application {    public LocationClient mLocationClient;    public MyLocationListener mMyLocationListener;    public Vibrator mVibrator;    public  OnGetDBLocation mOnGetDBLocation;    @Override    public void onCreate() {        super.onCreate();        mLocationClient = new LocationClient(this.getApplicationContext());        mMyLocationListener = new MyLocationListener();        mLocationClient.registerLocationListener(mMyLocationListener);        mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);    }    /**     * 实现实时位置回调监听     */    public class MyLocationListener implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            //Receive Location            MyLocation pMyLocation = new MyLocation();            StringBuilder sb = new StringBuilder(256);            pMyLocation.setTime(location.getTime());            pMyLocation.setErrorcode(location.getLocType());            pMyLocation.setLatitude(location.getLatitude());            pMyLocation.setLontitude(location.getLongitude());            pMyLocation.setRadius(location.getRadius());            if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果                sb.append("\nspeed : ");                sb.append(location.getSpeed());// 单位:公里每小时                sb.append("\nsatellite : ");                sb.append(location.getSatelliteNumber());                sb.append("\nheight : ");                sb.append(location.getAltitude());// 单位:米                sb.append("\ndirection : ");                sb.append(location.getDirection());                sb.append("\naddr : ");                sb.append(location.getAddrStr());                sb.append("\ndescribe : ");                sb.append("gps定位成功");                Log.d("skyfin", "gps定位成功");                Log.d("skyfin",sb.toString());            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果                pMyLocation.setAddr(location.getAddrStr());                pMyLocation.setDescribe("网络定位成功");            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果                pMyLocation.setAddr(location.getAddrStr());                pMyLocation.setDescribe("离线定位成功,离线定位结果也是有效的");            } else if (location.getLocType() == BDLocation.TypeServerError) {                pMyLocation.setAddr(location.getAddrStr());                pMyLocation.setDescribe("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {                pMyLocation.setAddr(location.getAddrStr());                pMyLocation.setDescribe("网络不同导致定位失败,请检查网络是否通畅");            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {                pMyLocation.setAddr(location.getAddrStr());                pMyLocation.setDescribe("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");            }            pMyLocation.setLocationdescribe(location.getLocationDescribe());// 位置语义化信息            // POI信息            if (location.getPoiList().size()!=0) {                pMyLocation.setList(location.getPoiList());            }            mOnGetDBLocation.get(pMyLocation);        }    }    public static interface OnGetDBLocation{        void get(MyLocation location);    }    public void setDBLocationListener(OnGetDBLocation dbLocationListener){        this.mOnGetDBLocation = dbLocationListener;    }}

4.添加定位的application

 <application        android:name=".app.LocationApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">

5.配置定位信息

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

6.最后显示在地图上

public class LocationActivity extends AppCompatActivity {    private LocationClient mLocationClient;    LocationClientOption mLocationClientOption = null;    private Button mStartLocationBtn;    private MapView mMapView = null;    private MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.COMPASS;    //百度地图层实体    BaiduMap mBaiduMap = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_location);        mMapView = (MapView) findViewById(R.id.bmapView);        mBaiduMap = mMapView.getMap();        mLocationClient = ((LocationApplication) getApplication()).mLocationClient;        mLocationClientOption = initLocationClientOption();        mLocationClient.setLocOption(mLocationClientOption);        mStartLocationBtn = (Button) findViewById(R.id.start_btn);        mStartLocationBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mStartLocationBtn.getText().toString().equals("开始定位")){                    mLocationClient.start();                    ((LocationApplication)getApplication()).setDBLocationListener(new LocationApplication.OnGetDBLocation() {                        @Override                        public void get(MyLocation location) {                            mBaiduMap.setMyLocationEnabled(true);                            MyLocationData locData = new MyLocationData.Builder()                                    .accuracy(location.getRadius())                                            // 此处设置开发者获取到的方向信息,顺时针0-360                                    .direction(100).latitude(location.getLatitude())                                    .longitude(location.getLongitude()).build();                            // 设置定位数据                            mBaiduMap.setMyLocationData(locData);                            // 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)                            //mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);                            MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, null);                            mBaiduMap.setMyLocationConfigeration(config);                        }                    });                    mStartLocationBtn.setText("正在定位");                }else{                    mLocationClient.stop();                    mStartLocationBtn.setText("开始定位");                }            }        });    }    private LocationClientOption initLocationClientOption() {        LocationClientOption option = new LocationClientOption();        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,        option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的        option.setIsNeedAddress(true);//可选,设置是否需  地址信息,默认不需要        option.setOpenGps(true);//可选,默认false,设置是否使用gps        option.setPriority(LocationClientOption.GpsOnly);        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果        option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死        option.setEnableSimulateGps(true);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到        return option;    }    @Override    public void onDestroy() {        super.onDestroy();        //在Fragment执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理        mMapView.onDestroy();    }    @Override    public void onResume() {        super.onResume();        //在Fragment执行onResume时执行mMapView.onResume (),实现地图生命周期管理        mMapView.onResume();    }    @Override    public void onPause() {        super.onPause();        //在Fragment执行onPause时执行mMapView.onPause (),实现地图生命周期管理        mMapView.onPause();    }}

截图
这里写图片描述

dome下载地址:https://github.com/locojyw/BaiduMapAPI.git

0 0
原创粉丝点击