bingoogolapple / bingoogolapple.github.io

个人主页。同时也通过 Issues 记录学习笔记
http://www.bingoogolapple.cn
86 stars 22 forks source link

Android 动态权限相关 #127

Open bingoogolapple opened 7 years ago

bingoogolapple commented 7 years ago

things-you-need-to-know-about-android-m-permission-developer-edition normal-dangerous

If any permission in a Permission Group is granted. Another permission in the same group will be automatically granted as well. In this case, once WRITE_CONTACTS is granted, application will also grant READ_CONTACTS and GET_ACCOUNTS.

bingoogolapple commented 7 years ago
public class PermissionUtil {
    /**
     * 跳转到权限设置界面的请求码
     */
    public static final int RC_PERMISSION_SETTINGS_SCREEN = 1025;
    /**
     * 访问外部存储权限
     */
    public static final int RC_PERMISSION_STORAGE = 1026;
    /**
     * 打电话权限
     */
    public static final int RC_PERMISSION_CALL_PHONE = 1027;
    /**
     * 定位权限
     */
    public static final int RC_PERMISSION_LOCATION = 1028;
    /**
     * 拍照权限
     */
    public static final int RC_PERMISSION_CAMERA = 1029;

    private static final int NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID = -1;

    private PermissionUtil() {
    }

    /**
     * 某些权限被拒绝
     *
     * @param activity
     * @param requestCode
     * @param perms
     */
    public static void onPermissionsDenied(MvcActivity activity, int requestCode, List<String> perms) {
        int contentResId = getCommonPermissionSettingDialogContentResId(requestCode);
        if (contentResId != NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID) {
            showOpenPermissionSettingsScreenDialog(activity, requestCode, contentResId);
        } else {
            activity.onSomePermissionPermanentlyDenied(requestCode);
        }

//        if (EasyPermissions.somePermissionPermanentlyDenied(activity, perms)) {
//            // 某些权限被永久拒绝
//            int contentResId = getCommonPermissionSettingDialogContentResId(requestCode);
//            if (contentResId != NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID) {
//                showOpenPermissionSettingsScreenDialog(activity, requestCode, contentResId);
//            } else {
//                activity.onSomePermissionPermanentlyDenied(requestCode);
//            }
//        } else {
//            // 某些权限被暂时拒绝
//            if (isNotHandleCommonPermissionsDenied(requestCode, activity)) {
//                activity.onPermissionsDenied(requestCode);
//            }
//        }
    }

    /**
     * 显示打开权限设置界面的对话框
     *
     * @param activity     MvcActivity
     * @param requestCode  权限请求码
     * @param contentResId 对话框提示内容
     */
    public static void showOpenPermissionSettingsScreenDialog(MvcActivity activity, int requestCode, @StringRes int contentResId) {
        new AppSettingsDialog.Builder(activity, activity.getString(contentResId, AppManager.getAppName()))
                .setTitle(activity.getString(R.string.permission_settings_title))
                .setPositiveButton(activity.getString(R.string.permission_settings_confirm))
                .setNegativeButton(activity.getString(R.string.permission_settings_cancel), (dialog, which) -> {
                    if (isNotHandleCommonPermissionsDenied(requestCode, activity)) {
                        activity.onClickCancelOpenPermissionsSettingsScreen(requestCode);
                    }
                })
                .setRequestCode(RC_PERMISSION_SETTINGS_SCREEN)
                .build()
                .show();
    }

    /**
     * 某些权限被拒绝
     *
     * @param fragment
     * @param requestCode
     * @param perms
     */
    public static void onPermissionsDenied(MvcFragment fragment, int requestCode, List<String> perms) {
        int contentResId = getCommonPermissionSettingDialogContentResId(requestCode);
        if (contentResId != NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID) {
            showOpenPermissionSettingsScreenDialog(fragment, requestCode, contentResId);
        } else {
            fragment.onSomePermissionPermanentlyDenied(requestCode);
        }

//        if (EasyPermissions.somePermissionPermanentlyDenied(fragment, perms)) {
//            // 某些权限被永久拒绝
//            int contentResId = getCommonPermissionSettingDialogContentResId(requestCode);
//            if (contentResId != NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID) {
//                showOpenPermissionSettingsScreenDialog(fragment, requestCode, contentResId);
//            } else {
//                fragment.onSomePermissionPermanentlyDenied(requestCode);
//            }
//        } else {
//            // 某些权限被暂时拒绝
//            if (isNotHandleCommonPermissionsDenied(requestCode, fragment)) {
//                fragment.onPermissionsDenied(requestCode);
//            }
//        }
    }

    /**
     * 显示打开权限设置界面的对话框
     *
     * @param fragment     RxFragment
     * @param requestCode  权限请求码
     * @param contentResId 对话框提示内容
     */
    public static void showOpenPermissionSettingsScreenDialog(MvcFragment fragment, int requestCode, @StringRes int contentResId) {
        new AppSettingsDialog.Builder(fragment, fragment.getString(contentResId, AppManager.getAppName()))
                .setTitle(fragment.getString(R.string.permission_settings_title))
                .setPositiveButton(fragment.getString(R.string.permission_settings_confirm))
                .setNegativeButton(fragment.getString(R.string.permission_settings_cancel), (dialog, which) -> {
                    if (isNotHandleCommonPermissionsDenied(requestCode, fragment)) {
                        fragment.onClickCancelOpenPermissionsSettingsScreen(requestCode);
                    }
                })
                .setRequestCode(RC_PERMISSION_SETTINGS_SCREEN)
                .build()
                .show();
    }

    /**
     * 获取公共的打开权限设置界面对话框的提示内容资源id
     *
     * @param requestCode
     * @return
     */
    private static int getCommonPermissionSettingDialogContentResId(int requestCode) {
        int contentResId = NO_COMMON_PERMISSION_SETTING_DIALOG_CONTENT_RES_ID;
        if (requestCode == RC_PERMISSION_STORAGE) {
            contentResId = R.string.permission_settings_content_storage;
        } else if (requestCode == RC_PERMISSION_CAMERA) {
            contentResId = R.string.permission_settings_content_camera;
        } else if (requestCode == RC_PERMISSION_CALL_PHONE) {
            contentResId = R.string.permission_settings_content_call_phone;
        } else if (requestCode == RC_PERMISSION_LOCATION) {
            contentResId = R.string.permission_settings_content_location;
        }
        return contentResId;
    }

    /**
     * 是否没有处理公共的权限被拒绝
     *
     * @param requestCode
     * @param lifecycleProvider
     * @return
     */
    private static boolean isNotHandleCommonPermissionsDenied(int requestCode, LifecycleProvider lifecycleProvider) {
        boolean isNotHandled = false;
        String appName = AppManager.getAppName();
        if (requestCode == RC_PERMISSION_STORAGE) {
            ToastUtil.show(AppManager.getApp().getString(R.string.tip_permission_storage_denied, appName));
            RxUtil.runInUIThreadDelay(1500, lifecycleProvider).subscribe(aVoid -> AppManager.getInstance().exit());
        } else if (requestCode == RC_PERMISSION_CAMERA) {
            ToastUtil.show(AppManager.getApp().getString(R.string.tip_permission_camera_denied, appName));
        } else if (requestCode == RC_PERMISSION_CALL_PHONE) {
            ToastUtil.show(AppManager.getApp().getString(R.string.tip_permission_call_phone_denied, appName));
        } else if (requestCode == RC_PERMISSION_LOCATION) {
            ToastUtil.show(AppManager.getApp().getString(R.string.tip_permission_location_denied, appName));
        } else {
            isNotHandled = true;
        }
        return isNotHandled;
    }

    public interface Delegate {
        void onClickCancelOpenPermissionsSettingsScreen(int requestCode);

        void onPermissionsDenied(int requestCode);

        void onSomePermissionPermanentlyDenied(int requestCode);
    }
}