感谢 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();