最近在做基于高德sdk的一个定位的应用,遇到了定位权限判断错误的问题,之前查的是根据LocationManager来判断系统定位是否开启,原以为这个就可以判断应用是否具有定位权限,但是发现这个是用于判断系统的gps是否开启,跟应用是否有定位权限无关。
后通过查阅高德的api和常见问题,发现可通过高德定位的 onLocationChanged 回调返回的错误码来判断应用是否有定位权限。查看高德api
如果SDK明确检查出定位权限缺失时会返回错误码12,如果没有检查出来定位权限缺失,但此时所有定位数据源又都不可用,则会返回13。无论返回的是12或者是13,都说明设备现在所处环境不足以完成定位功能。
当判断为没有定位权限时,需引导用户去系统设置页手动开启定位权限,可用AlertDialog处理。各类Android手机的定位权限页的跳转方式各不相同,需定义个工具类来处理不同手机跳转的问题,具体代码可参考博客Android 跳转权限设置界面的终极适配(适配各大定制 ROM)
最后附上我最终的处理代码,以供参考:
//开启权限的dialog
private android.support.v7.app.AlertDialog.Builder builder;
private boolean isDialogShow = false;
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
mLogger.info("onLocationChanged");
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
mLogger.info("accuracy:" + aMapLocation.getAccuracy() + " (" + aMapLocation.getLatitude() + ", " + aMapLocation.getLongitude() + ")");
LatLng point = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
if (time == 0) {
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(point, 19));
time++;
}
current_point = point;
//拟路径
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
drawDotLine();
}
}, 1000);
} else {
mLogger.info("errorCode:" + aMapLocation.getErrorCode());
//当错误码是12或13时,表示app无定位权限,跳转到系统定位权限设置页,手动打开系统定位权限
if (aMapLocation.getErrorCode() == 12 || aMapLocation.getErrorCode() == 13) {
if (!isDialogShow) {
openGPSDialog();
}
}
}
}
}
private void openGPSDialog() {
builder = new android.support.v7.app.AlertDialog.Builder(this);
builder.setTitle("请打开应用定位权限")
.setMessage("为了提高定位的准确度,更好的为您服务,请打开GPS")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//跳转到手机打开GPS页面
new PermissionPageUtil(MainActivity.this).jumpPermissionPage();
isDialogShow = false;
}
})
.setNeutralButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
isDialogShow = false;
}
}).show();
isDialogShow = true;
}