开发工具:
Android studio
废话话就不说了,下面是本人在用6.0版本手机中定位的时候也出现偏差,我自己是偏到非洲那边了,后来发现原来是缺少定位权限(注释:这里的权限指的不是配置文件里面的权限,是获取6.0版本手机的定位权限,调用时会提醒你是否使用,点击允许即可),下面是我已近在6.0手机(华为 mate8)上使用过了
,在activity里里面调用
getPersimmions()方法即可(
前提:有权限,key,MapView组件,jar都有的情况下
),并在该方法里面写上开始定位的方法,这是判断当前版本,获取权限(允许一次就可以,第二次进入既不会再次获取权限),
获取权限就可调用百度地图显示 就不会再6.0手机上出现定位出错的问题
private final int
SDK_PERMISSION_REQUEST = 127;
@TargetApi
(23)
/*
*判断当前是否是6.0版本
*/
@TargetApi(23)
private void getPersimmions() {
判断当前是否是6.0版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> permissions = new ArrayList<String>();
/***
* 定位权限为必须权限,用户如果禁止,则每次进入都会申请
*/
// 定位精确位置
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (permissions.size() > 0) {
requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST);
} else {
//****这里写自己的定位调用***/
///当权限都有时,开始定位
getMapView();
}
} else {
//****这里写自己的定位调用***/
///低于6.0以下,开始定位
getMapView();
}
}
@TargetApi(23)
private boolean addPermission(ArrayList<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
// 如果应用没有获得对应权限,则添加到列表中,准备批量申请
if (shouldShowRequestPermissionRationale(permission)) {
return true;
} else {
permissionsList.add(permission);
return false;
}
} else {
return true;
}
}
/**
* 请求权限后,系统会弹出请求权限的Dialog
* 用户选择允许或需要后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
*/
@TargetApi(23)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// TODO Auto-generated method stub
///权限允许后,开始定位
getMapView();
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
///以下是百度地图代码///
private void getMapView() {
// 设置是否显示比例尺控件
mapView.showScaleControl(true);
// 设置是否显示缩放控件
mapView.showZoomControls(false);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
locationmode, true, null));
// 设置定位图层配置信息(跟随,罗盘,没有)
locationmode = MyLocationConfiguration.LocationMode.NORMAL;
// 创建定位服务的客户端
client = new LocationClient(this);
MyLocationListener listener = new MyLocationListener();
client.registerLocationListener(listener);
// 开始定位
client.setLocOption(getDefaultLocationClientOption());
client.start();
startHandle();
}
@SuppressWarnings("deprecation")
public LocationClientOption getDefaultLocationClientOption() {
if (option == null) {
option = new LocationClientOption();
option.setOpenGps(true);
// 修复6.0错误
option.setPriority(LocationClientOption.GpsFirst);
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
option.setScanSpan(1500);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(false);// 可选,设置是否需要地址信息,默认不需要
option.setIsNeedLocationDescribe(false);// 可选,设置是否需要地址描述
option.setNeedDeviceDirect(true);// 可选,设置是否需要设备方向结果
option.setLocationNotify(false);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.setIsNeedLocationDescribe(false);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(false);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
}
return option;
}
// 获取位置监听///
private class MyLocationListener implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
if (location == null || mapView == null)
return;
获得当前的经纬度和地址
bdlocation = location;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(location.getDirection())
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
baiduMap.setMyLocationData(locData);
if (isFirstLocation) {
isFirstLocation = false;
Log.i("经纬度:", "---" + location.getLatitude() + "\n"
+ location.getLongitude());
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus mapStatus = new MapStatus.Builder().target(latLng)
.zoom(13).build();
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mapStatus);
// 以动画方式更新地图状态
baiduMap.animateMapStatus(mapStatusUpdate);
}
}
@SuppressWarnings("unused")
public void onReceivePoi(BDLocation poiLocation) {
}
}
以上就可读取手机权限,进行定位判断。。。。。