打造简洁高效的动态权限管理器

简介: 转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN效果图GitHub地址:PermissionsManager 随着Android 6.0的普及,动态权限的重要性也开始时慢慢体现出来。

转载请说明出处!
作者:kqw攻城狮
出处:个人站 | CSDN


效果图

这里写图片描述

GitHub地址:PermissionsManager

随着Android 6.0的普及,动态权限的重要性也开始时慢慢体现出来。为了更好的保护用户隐私,Android 6.0要求在进行敏感操作之前,必须要向用户请示申请权限。

如何使用,在之前的文章里也已经介绍过了,但是用起来比较麻烦。Android6.0动态获取权限

我希望可以封装一下,使用之前创建一个动态权限的管理对象,他有两个回调来告诉我权限申请成功或者失败,像这样:

mPermissionsManager = new PermissionsManager(this) {
    @Override
    public void authorized(int requestCode) {
        // TODO 权限通过
    }

    @Override
    public void noAuthorization(int requestCode, String[] lacksPermissions) {
        // TODO 有权限没有通过
    }
};

使用的时候,可以直接调用一个方法,把要请示的权限传进去就可以进行校验,像这样:

// 检查权限
mPermissionsManager.checkPermissions("请求码", "要校验的权限");

于是乎,下面封装的动态权限管理器就来了:

动态权限管理器

package com.kongqw.permissionslibrary;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

import java.util.ArrayList;

/**
 * Created by kongqingwei on 2017/2/15.
 * 检查权限的类
 */

public abstract class PermissionsManager {

    private static final String PACKAGE_URL_SCHEME = "package:";
    private Activity mTargetActivity;

    public abstract void authorized(int requestCode);

    public abstract void noAuthorization(int requestCode, String[] lacksPermissions);

    public PermissionsManager(Activity targetActivity) {
        mTargetActivity = targetActivity;
    }

    /**
     * 检查权限
     *
     * @param requestCode 请求码
     * @param permissions 准备校验的权限
     */
    public void checkPermissions(int requestCode, String... permissions) {

        ArrayList<String> lacks = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(mTargetActivity.getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED) {
                lacks.add(permission);
            }
        }

        if (!lacks.isEmpty()) {
            // 有权限没有授权
            String[] lacksPermissions = new String[lacks.size()];
            lacksPermissions = lacks.toArray(lacksPermissions);
            //申请CAMERA权限
            ActivityCompat.requestPermissions(mTargetActivity, lacksPermissions, requestCode);
        } else {
            // 授权
            authorized(requestCode);
        }
    }

    /**
     * 复查权限
     * <p>
     * 调用checkPermissions方法后,会提示用户对权限的申请做出选择,选择以后(同意或拒绝)
     * TargetActivity会回调onRequestPermissionsResult方法,
     * 在onRequestPermissionsResult回调方法里,我们调用此方法来复查权限,检查用户的选择是否通过了权限申请
     *
     * @param requestCode  请求码
     * @param permissions  权限
     * @param grantResults 授权结果
     */
    public void recheckPermissions(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                // 未授权
                noAuthorization(requestCode, permissions);
                return;
            }
        }
        // 授权
        authorized(requestCode);
    }

    /**
     * 进入应用设置
     *
     * @param context context
     */
    public static void startAppSettings(Context context) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + context.getPackageName()));
        context.startActivity(intent);
    }
}

应用

使用起来的逻辑也比较清晰简单,一共3步:

1. 初始化权限管理器

// 初始化
mPermissionsManager = new PermissionsManager(this) {
    @Override
    public void authorized(int requestCode) {
        Toast.makeText(getApplicationContext(), requestCode + " : 全部权限通过", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void noAuthorization(int requestCode, String[] lacksPermissions) {
        Toast.makeText(getApplicationContext(), requestCode + " : 有权限没有通过!需要授权", Toast.LENGTH_SHORT).show();
        for (String permission : lacksPermissions) {
            Log.i(TAG, "noAuthorization: " + permission);
        }
    }
};

2. 检查权限

// 要校验的权限
String[] PERMISSIONS = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA};
// 检查权限
mPermissionsManager.checkPermissions(0, PERMISSIONS);

3. 复查权限

用户对权限申请的提示做出选择以后,要重写TargetActivity的onRequestPermissionsResult方法来复查权限,检查权限是否通过。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    // 用户做出选择以后复查权限,判断是否通过了权限申请
    mPermissionsManager.recheckPermissions(requestCode, permissions, grantResults);
}

进入应用设置页面

最后,权限没有通过,是不能使用的,如果一定要用,一般要提示用户缺少权限,到应用设置页面去吧权限打开,再回来使用。
对话框就不写了,进入到应用的设置页面可以直接调用PermissionsManager里的startAppSettings方法,进入到该应用的设置页面,修改权限

PermissionsManager.startAppSettings(getApplicationContext());
相关文章
|
6月前
|
设计模式 uml C++
C++中的装饰器模式:灵活地扩展功能
C++中的装饰器模式:灵活地扩展功能
94 0
|
数据可视化 IDE 安全
云巧-让开发更简单,更高效,更方便
近年来,快速迭代的新需求将引导企业改变其开发方式,进而转向使用支持快速、安全和高效的技术架构,组装式应用便成为了企业重要的战略技术趋势。组装式应用引入模块化的理念,使得各企业可以更敏捷、更有效地复用能力模块,提高商业的韧性和效率。云巧平台应运而生,能极大的改善开发环境,节省开发工作量,让开发更简单,更高效,更方便。
1894 0
|
4月前
|
安全 Java 数据安全/隐私保护
构建高效网站后台:权限管理系统设计与实现
【7月更文挑战第5天】在现代Web应用开发中,权限管理是后台系统不可或缺的一部分,它确保了系统的安全性与用户数据的隐私。良好的权限管理系统能够精细控制不同用户角色对功能模块及数据资源的访问权限,从而提升系统的灵活性和安全性。本文将深入探讨权限管理的基本概念、设计思路,并通过一个简单的代码示例展示如何在Web后台中实现基本的权限控制逻辑。
282 2
|
6月前
|
前端开发 JavaScript 测试技术
构建高效前端项目:模块化与组件化策略
【2月更文挑战第25天】 在现代网页开发中,随着用户对于网页性能和交互体验的期待不断提升,前端项目的复杂性也随之增加。为了应对这种复杂性并提高开发效率,本文将探讨模块化与组件化在前端项目中的应用策略。通过分析这两种方法的优势与适用场景,我们将揭示如何利用它们来优化项目结构,提升代码复用率,以及加快开发流程。
145 4
|
设计模式 JSON 数据可视化
如何设计一个灵活的审批流程
如何设计一个灵活的审批流程
549 0
|
前端开发 JavaScript
“构建高效的前端表单验证与增删改功能实现“
“构建高效的前端表单验证与增删改功能实现“
62 0
|
设计模式 算法
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
89 0
|
前端开发 JavaScript 测试技术
设计一个前端组件库,需要具备哪些能力?
唉,时间过得真快,算下来已经过去快3年了。当时只是想发在 v2ex 上骗骗赞,今天正好看到这个话题就来分享一下做这个组件库的心得吧,希望可以给你一点灵感~
设计一个前端组件库,需要具备哪些能力?
|
资源调度 数据安全/隐私保护
Umi@3 中最灵活的权限控制方案
Umi@3 中最灵活的权限控制方案
1038 0
|
存储 缓存 监控
如何为从 1 到 10 万用户的应用程序,设计不同的扩展方案?
对于创业公司来说,有用户注册是好事情,但是当用户从零扩展到成千上万之后,Web 应用程序又该如何支持呢?