Android之权限管理

        • 申请权限接口
        • BaseActivity中权限申请处理
        • 权限申请处理应用

申请权限接口

import java.util.List;/** * Description:  权限申请回调接口 * Author: fpp * Date: 2018/10/8  10:54 */public interface PermissionListener {    /**     * 已获取到所需全部权限     *     * @param permissionRequestCode 请求码     */    void onGranted(int permissionRequestCode);    /**     * 未获取到所需全部权限     *     * @param deniedPermission      被拒绝的权限     * @param permissionRequestCode 请求码     */    void onDenied(List deniedPermission, int permissionRequestCode);    /**     * 未获取到所需全部权限并勾选不再提醒     *     * @param deniedPermission      勾选了不再询问的权限     * @param permissionRequestCode 请求码     */    void onShouldShowRationale(List deniedPermission, int permissionRequestCode);}

BaseActivity中权限申请处理

    /**     * 默认请求码     */    public int mPermissionRequestCode = 10001;    /**     * 权限请求监听接口     */    private PermissionListener listener;    public void setListener(PermissionListener listener) {        this.listener = listener;    }    /**     * 检测是否有所需权限     *     * @param context     * @param perms   所需权限数组     * @return     */    public static boolean checkPermissions(@NonNull Context context,                                           @Size(min = 1) @NonNull String... perms) {        // Always return true for SDK < M, let the system deal with the permissions        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {            LogUtil.e("hasPermissions: API version < M, returning true by default");            // DANGER ZONE!!! Changing this will break the library.            return true;        }        // Null context may be passed if we have detected Low API (less than M) so getting        // to this point with a null context should not be possible.        if (context == null) {            throw new IllegalArgumentException("Can't check permissions for null context");        }        for (String perm : perms) {            if (ContextCompat.checkSelfPermission(context, perm)                    != PackageManager.PERMISSION_GRANTED) {                return false;            }        }        return true;    }    /**     * 申请权限     *     * @param requestCode 请求码     * @param permissions 需要申请的权限     */    @TargetApi(Build.VERSION_CODES.M)    public void requestPermissions(int requestCode, @NonNull String[] permissions) {        mPermissionRequestCode = requestCode;        List requestPermissionList = new ArrayList<>();        //查找未获取的权限        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {                requestPermissionList.add(permission);            }        }        if (requestPermissionList.isEmpty()) {            //已获取所有请求权限            permissionAllGranted(mPermissionRequestCode);        } else {            //获取权限            requestPermissions(requestPermissionList.toArray(                    new String[requestPermissionList.size()]), mPermissionRequestCode);        }    }    /**     * 申请权限结果     *     * @param requestCode  请求码 要等于申请时候的请求码     * @param permissions  申请的权限数组     * @param grantResults 对应权限的处理结果     */    @RequiresApi(api = Build.VERSION_CODES.M)    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode != mPermissionRequestCode) {            return;        }        if (grantResults.length > 0) {            List deniedPermissionList = new ArrayList();            for (int i = 0; i < grantResults.length; i++) {                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {                    deniedPermissionList.add(permissions[i]);                }            }            if (deniedPermissionList.isEmpty()) {                //已获取全部所需权限                permissionAllGranted(mPermissionRequestCode);            } else {                //勾选了“禁止后不在询问”选项, 返回false                for (String deniedPermission : deniedPermissionList) {                    boolean flag = shouldShowRequestPermissionRationale(deniedPermission);                    if (!flag) {                        // 未获取到权限 并勾选了不再询问选项                        permissionShouldShowRationale(deniedPermissionList, mPermissionRequestCode);                        return;                    }                }                // 未获取到所需全部权限                permissionHasDenied(deniedPermissionList, mPermissionRequestCode);            }        }    }    /**     * 获取应用详情页面intent(如果找不到要跳转的界面,也可以先把用户引导到系统设置页面)     *     * @return     */    public Intent getAppDetailSettingIntent() {        Intent localIntent = new Intent();        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        if (Build.VERSION.SDK_INT >= 9) {            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");            localIntent.setData(Uri.fromParts("package", getPackageName(), null));        } else if (Build.VERSION.SDK_INT <= 8) {            localIntent.setAction(Intent.ACTION_VIEW);            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");            localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());        }        return localIntent;    }    /**     * 已获取所需全部权限     *     * @param permissionRequestCode 获取权限请求码     */    private void permissionAllGranted(int permissionRequestCode) {        if (listener != null) {            listener.onGranted(permissionRequestCode);        }    }    /**     * 未获取到所需全部权限     *     * @param deniedList            未获取到的权限     * @param permissionRequestCode 获取权限请求码     */    private void permissionHasDenied(List deniedList, int permissionRequestCode) {        if (listener != null) {            listener.onDenied(deniedList, permissionRequestCode);        }    }    /**     * 未获取到相关权限并且勾选了不再询问     *     * @param deniedList            勾选了不在询问的权限     * @param permissionRequestCode 获取权限请求码     */    private void permissionShouldShowRationale(List deniedList, int permissionRequestCode) {        if (listener != null) {            listener.onShouldShowRationale(deniedList, permissionRequestCode);        }    }

权限申请处理应用

  1. 权限申请监听设置
        this.setListener(new PermissionListener() {            // 申请到所需全部权限            @Override            public void onGranted(int permissionRequestCode) {                if (mPermissionRequestCode == permissionRequestCode){                    UIUtil.toast("已获取到相关权限!进行后续操作!");                }            }            // 未申请到所需全部权限            @Override            public void onDenied(List deniedPermission, int permissionRequestCode) {                if (mPermissionRequestCode == permissionRequestCode){                    UIUtil.toast("未获取到相关权限!不能进行后续操作!");                }            }            // 未申请到所需全部权限,并存在部分权限勾选了不再提示选项。            @Override            public void onShouldShowRationale(List deniedPermission, int permissionRequestCode) {                if (mPermissionRequestCode == permissionRequestCode){                    // 跳转到应用详情,进行权限设置                    startActivity(getAppDetailSettingIntent());                }            }        });
  1. 申请权限
   // 没有权限,去申请   requestPermissions(mPermissionRequestCode,perms);

更多相关文章

  1. Android开发人员不得不收集的代码(持续更新中)
  2. Androidの通过查询电话号码或ID获取联系人头像
  3. Android兼容android7.0、及Android8.0以上apk安装权限问题(二)
  4. Android(安卓)为【apk】文件签名,增加修改系统时间等权限
  5. Android(安卓)的提权 (root) 原理是什么?
  6. Android程序版本控制工具类
  7. Android(安卓)自带日期(DatePicker)和时间(TimePicker)选择器使
  8. android adb pm命令
  9. android 根据res文件夹下(如res/raw)文件名获取其id

随机推荐

  1. ListView的Item中包含checkbox,Item无法点
  2. Dojo mobile TweetView 系列教程之五 —
  3. 2018-03-18Android笔记之Activity生命周
  4. Android中的Handler总结
  5. android不透明度对应的值
  6. Json解析速度比较-Android(安卓)API、Gso
  7. Eclipse开发Android的配置(包括ADT安装,SDK
  8. 打开TabLayout的正确姿势
  9. HttpClient请求https url时 ssl exceptio
  10. Android(安卓)一一 简述Android四大组件