Android定位权限判断及开启

最近在做基于高德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;
    }

你可能感兴趣的:(android开发学习记录)