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


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


效果图

这里写图片描述

GitHub地址:PermissionsManager

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

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

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

1
2
3
4
5
6
7
8
9
10
11
mPermissionsManager = new PermissionsManager(this) {
@Override
public void authorized(int requestCode) {
// TODO 权限通过
}
@Override
public void noAuthorization(int requestCode, String[] lacksPermissions) {
// TODO 有权限没有通过
}
};

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

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

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

动态权限管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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. 初始化权限管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 初始化
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. 检查权限

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

3. 复查权限

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

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

进入应用设置页面

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

1
PermissionsManager.startAppSettings(getApplicationContext());
坚持原创技术分享,您的支持将鼓励我继续创作!