感谢 hyman 的视频教学课程:https://www.imooc.com/video/5686
一、在AndroidManifest中百度地图定位服务
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
二、在布局xml文件中添加地图控件
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
三、核心代码
- 声明所需变量
private LocationClient mLocationClient; private MyLocationListener mLocationListener; private boolean isFirstIn = true; //是否为初次定位 private double mLatitude; //记录纬度值 private double mLongtitude; //记录精度值
- 核心代码
private void initLocation() //初始化函数 { mLocationClient = new LocationClient(this); mLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(mLocationListener); LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll"); //坐标类型 option.setIsNeedAddress(true); option.setOpenGps(true); option.setScanSpan(1000); //每隔多少秒进行一次请求 mLocationClient.setLocOption(option); }
private class MyLocationListener implements BDLocationListener //地图监听函数 { @Override public void onReceiveLocation(BDLocation location) { MyLocationData data = new MyLocationData.Builder() .accuracy(location.getRadius()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(data); // 记录最新的经纬度 mLatitude = location.getLatitude(); mLongtitude = location.getLongitude(); if (isFirstIn) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(msu); //动画效果 isFirstIn = false; } } }
@Override protected void onStart() { super.onStart(); // 开启定位 mBaiduMap.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) mLocationClient.start(); }@Override protected void onStop() { super.onStop(); // 停止定位 mBaiduMap.setMyLocationEnabled(false); mLocationClient.stop(); }
四、其它
1、Android 6.0中动态权限获取机制问题
- 百度地图api官方文档:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/androidm-notice
2、 Android 6.0中动态获取权限
private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
public static void verifyStoragePermissions(Activity activity) { int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } }
3、定位返回错误码
可通过Location.getLocType()方法获取错误码信息,具体说明如下:
61:GPS定位结果,GPS定位成功。
62:无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位。
63:网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。
66:离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
68:网络连接失败时,查找本地离线定位时对应的返回结果。
161:网络定位结果,网络定位成功。
162:请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。
167:服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。
505:AK不存在或者非法,请按照说明文档重新申请AK。
int code = location.getLocType(); String s=String.valueOf(code); Toast.makeText(context, s, Toast.LENGTH_SHORT).show();