关于安卓动态请求权限的一些东西

1、这是一些动态验证权限的方法

/**
 * 该方法是用来检查是否具有照相机的权限。
 * Android6.0之后的手机,动态请求。之前的直接跳转到设置界面。
 */
public int checkHaveCameraPermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.CAMERA);
    return i;
}

/**
 * 该方法是用来检查是否具有录音的权限。
 * Android6.0之后的手机,动态请求。之前的直接跳转到设置界面。
 */
public int checkHaveRecordAudioPermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.RECORD_AUDIO);
    return i;
}

/**
 * 是否有读取内存的权限
 *
 * @param activity
 * @return
 */
public int checkHaveExternalStoragePermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    return i;
}

/**
 * 是否有获取位置的权限
 *
 * @param activity
 * @return
 */
public int checkHaveLocationPermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.ACCESS_FINE_LOCATION);
    return i;
}

/**
 * 是否有获取手机状态的权限
 *
 * @param activity
 * @return
 */
public int checkHaveReadPhoneStatePermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.READ_PHONE_STATE);
    return i;
}

/**
 * 是否有华为的WRITE_SETTINGS全新
 *
 * @param activity
 * @return
 */
public int checkHaveWriteSettingPermission(Activity activity) {
    int i = checkHavePermissions(activity, Manifest.permission.WRITE_SETTINGS);
    return i;
}

/**
 * 该方法用来请求是否具备某些权限。当前先不对外提供,以后有其他权限请求在对外提供
 */
private int checkHavePermissions(Activity activity, String permission) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // 检查该权限是否已经获取
        int i = ContextCompat.checkSelfPermission(activity, permission);
        return i;
    }
    return PackageManager.PERMISSION_GRANTED;
}

 2、这是点击按钮时候,需要先动态验证权限的代码内容。

/**
 * 请求相机权限
 */
private final int REQUEST_PERMISSION_CAMERA = 2;

/**
 * 请求录音的权限
 */
private final int REQUEST_PERMISSION_RECORD_AUDIO = 3;

/**
 * 请求存储权限
 */
private final int REQUEST_PERMISSION_READ_EXTERNAL_STORAGE = 4;
    ......

int cameraPermission = AppUtils.getUtils().checkHaveCameraPermission(mActivity);
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
    //没有相机权限,请求相机权限
    ActivityCompat.requestPermissions(ClasszoneActivity.this,
            new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
    return;
}

int recordAudioPermission = AppUtils.getUtils().checkHaveRecordAudioPermission(mActivity);
if (recordAudioPermission != PackageManager.PERMISSION_GRANTED) {
    //没有录音权限,请求录音权限
    ActivityCompat.requestPermissions(ClasszoneActivity.this,
            new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_PERMISSION_RECORD_AUDIO);
    return;
}

int externalStoragePermission = AppUtils.getUtils().checkHaveExternalStoragePermission(mActivity);
if (externalStoragePermission != PackageManager.PERMISSION_GRANTED) {
    //没有存储权限,请求存储权限
    ActivityCompat.requestPermissions(ClasszoneActivity.this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_READ_EXTERNAL_STORAGE);
    return;
}
......点击后的后续操作,或者不是点击其他的逻辑处理
3、然后需要重写activity的onRequestPermissionResult()方法进行处理,防止部分用户选择了不在弹出请求权限对话框的操作。
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {

            case REQUEST_PERMISSION_CAMERA:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                        // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
                        boolean b = shouldShowRequestPermissionRationale(permissions[0]);
                        if (!b) {
                            // 用户还是想用我的 APP 的
                            // 提示用户去应用设置界面手动开启权限
                            AppUtils.getUtils().showDialogTipUserGoToAppSettting(
                                    ClasszoneActivity.this, getString(R.string.openCameraPermission));
                        } else {
//                            finish();
                        }
                    } else {
                        AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess));
                    }
                }
                break;

            case REQUEST_PERMISSION_READ_EXTERNAL_STORAGE:
                //请求存储权限
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                        // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
                        boolean b = shouldShowRequestPermissionRationale(permissions[0]);
                        if (!b) {
                            // 用户还是想用我的 APP 的
                            // 提示用户去应用设置界面手动开启权限
                            AppUtils.getUtils().showDialogTipUserGoToAppSettting(
                                    ClasszoneActivity.this, getString(R.string.openExternalPermission));
                        } else {
//                            finish();
                        }
                    } else {
                        AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess));
                    }
                }
                break;

            case REQUEST_PERMISSION_RECORD_AUDIO:
                //录音
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                        // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
                        boolean b = shouldShowRequestPermissionRationale(permissions[0]);
                        if (!b) {
                            // 用户还是想用我的 APP 的
                            // 提示用户去应用设置界面手动开启权限
                            AppUtils.getUtils().showDialogTipUserGoToAppSettting(
                                    ClasszoneActivity.this, getString(R.string.openRadioPermission));
                        } else {
//                            finish();
                        }
                    } else {
                        AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess));
                    }
                }
                break;

            default:
                break;

        }
    }
注:
 
 
1、AppUtils.getUtils().showDialogTipUserGoToAppSettting(
                                    ClasszoneActivity.this, getString(R.string.openRadioPermission));

该方法是弹出对话框,让用户是否去选择跳转进入到手机的设置页面进行权限的开启。

该方法是跳转到手机权限设置界面,部分手机可能不适合,需要再想办法
/**
     * 跳转到权限设置界面
     */
    public void jumpAppDetailSettingIntent(Context activity) {

        // vivo 点击设置图标>加速白名单>我的app
        //      点击软件管理>软件管理权限>软件>我的app>信任该软件
        Intent appIntent = activity.getPackageManager().getLaunchIntentForPackage("com.iqoo.secure");
        if (appIntent != null) {
            activity.startActivity(appIntent);
//            floatingView = new SettingFloatingView(this, "SETTING", activity.getApplication(), 0);
//            floatingView.createFloatingView();
            return;
        }
//
//        // oppo 点击设置图标>应用权限管理>按应用程序管理>我的app>我信任该应用
//        //      activity>自启动管理>我的app
        appIntent = activity.getPackageManager().getLaunchIntentForPackage("com.oppo.safe");
        if (appIntent != null) {
            activity.startActivity(appIntent);
//            floatingView = new SettingFloatingView(this, "SETTING", activity.getApplication(), 1);
//            floatingView.createFloatingView();
            return;
        }

        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", activity.getPackageName(), null));
        }
        activity.startActivity(intent);
    }
2、
 
 
AppUtils.getUtils().alertCommonText(getString(R.string.getPermissionSuccess));
是我自定义的弹出toast的方法。

猜你喜欢

转载自blog.csdn.net/Jermmy1207/article/details/80771034