最近在做基于高德sdk的一个定位的应用,遇到了定位权限判断错误的问题,之前查的是根据LocationManager来判断系统定位是否开启,原以为这个就可以判断应用是否具有定位权限,但是发现这个是用于判断系统的gps是否开启,跟应用是否有定位权限无关。
后通过查阅高德的api和常见问题,发现可通过高德定位的 onLocationChanged 回调返回的错误码来判断应用是否有定位权限。查看高德api
如果SDK明确检查出定位权限缺失时会返回错误码12,如果没有检查出来定位权限缺失,但此时所有定位数据源又都不可用,则会返回13。无论返回的是12或者是13,都说明设备现在所处环境不足以完成定位功能。
当判断为没有定位权限时,需引导用户去系统设置页手动开启定位权限,可用AlertDialog处理。各类Android手机的定位权限页的跳转方式各不相同,需定义个工具类来处理不同手机跳转的问题,具体代码可参考博客Android 跳转权限设置界面的终极适配(适配各大定制 ROM)
最后附上我最终的处理代码,以供参考:
//开启权限的dialogprivate android.support.v7.app.AlertDialog.Builder builder;private boolean isDialogShow = false;@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//跳转到手机打开GPS页面new PermissionPageUtil(MainActivity.this).jumpPermissionPage();isDialogShow = false;}}).setNeutralButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();isDialogShow = false;}}).show();isDialogShow = true;}