安卓6.0动态权限设置

在BaseActivity中申请APP所需要的危险权限,此处只列举了三项,
在所需要的activity中调用对应的权限判断,根据需要调用不同的空实现方法实现逻辑处理,对于小米、华为等手机,在第一点击拒绝后,将不再弹出提示信息,本人的做法是在点击拒绝后弹出提示框,告知用户此权限的重要性,并让用户点击设置去设置权限。设置按钮跳转到当前应用的设置界面,见最后代码。

// sd卡权限
private String[] SdCardPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
//手机状态权限
private String[] readPhoneStatePermission = {Manifest.permission.READ_PHONE_STATE};
//定位权限
private String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION};

/**
 * sd卡权限判断。当手机系统大于 23 时,才有必要去判断权限是否获取
 */
 protected void judgeSdCardPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            int i = ContextCompat.checkSelfPermission(this, SdCardPermission[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (i != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, SdCardPermission, 100);
            }else{
        doSdCardResult();
       }
        }else{
        doSdCardResult();
        }
    }
/**
 * 手机状态权限
 */
 protected void judgePhoneStatePermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            int i = ContextCompat.checkSelfPermission(this, readPhoneStatePermission[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (i != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, readPhoneStatePermission, 200);
            }else{
        doPhoeStateResult();
        }
        }
        else{
    doPhoeStateResult();
    }
    }
/**
 * 定位权限
 */
 protected void judgeLocationPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            int i = ContextCompat.checkSelfPermission(this, locationPermission[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (i != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, locationPermission, 300);
            }else{
        doLocationResult();
        }
        }else{
    doLocationResult();
    }
    }
/**
 * 用户权限 申请 的回调方法
 */
  @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    doSdCardResult();
                }
            }else{
        弹出对话框提示用户去设置,如果不设置直接退出
        }
        }
        if (requestCode == 200) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    doPhoneStateResult();
                }
                else{
        弹出对话框提示用户去设置,如果不设置直接退出
        }
            }
        }
        if (requestCode == 300) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    doLocationResult();
                }
                else{
        弹出对话框提示用户去设置,如果不设置直接退出
        }
            }
        }
    }
/**
 * 空实现,根据自己的需要做相应的逻辑处理
 */
     protected void doSdCardResult() {}

    protected void doPhoneStateResult() {}

    protected void doLocationResult() {}

针对小米、华为等手机,跳转到当前应用设置界面

    /**
     * 跳转到当前应用设置界面
     */
    private void jumpToSetting() {
        isSettingFlag=true;
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package",getPackageName(), null);
        intent.setData(uri);
        startActivity(intent);
    }

在onResume()方法中做判断,如果没有设置直接退出当前界面

 @Override
    protected void onResume() {
        super.onResume();
        if (isSettingFlag){
            if (ActivityCompat.checkSelfPermission(this,CameraPermission[0])!=PackageManager.PERMISSION_GRANTED){
                //如果没有获取权限
                finish();
            }else {
                doCameraResult();
            }
            isSettingFlag=false;
        }
    }

你可能感兴趣的:(技术专区,android,app,动态权限)