Skip to content

Commit 999f2b2

Browse files
committed
优化权限拦截器方法参数结构
优化错误检查机制 API 命名的信息提示 修正获取到的清单内容不是当前应用的 Bug 修正在某些机型上面获取清单文件失败的问题
1 parent 1e6ed55 commit 999f2b2

File tree

15 files changed

+283
-192
lines changed

15 files changed

+283
-192
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ build
66
captures
77

88
._*
9+
*.apk
910
*.iml
1011
.DS_Store
1112
local.properties

HelpDoc.md

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ public class XxxApplication extends Application {
131131
public final class PermissionInterceptor implements IPermissionInterceptor {
132132

133133
@Override
134-
public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions) {
134+
public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> allPermissions) {
135+
// 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
135136
new AlertDialog.Builder(activity)
136137
.setTitle("授权提示")
137138
.setMessage("使用此功能需要先授予权限")
@@ -140,7 +141,7 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
140141
@Override
141142
public void onClick(DialogInterface dialog, int which) {
142143
dialog.dismiss();
143-
PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), PermissionInterceptor.this, callback);
144+
PermissionFragment.beginRequest(activity, new ArrayList<>(allPermissions), PermissionInterceptor.this, callback);
144145
}
145146
})
146147
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@@ -154,25 +155,26 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
154155
}
155156

156157
@Override
157-
public void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
158-
if (callback == null) {
159-
return;
158+
public void grantedPermissions(Activity activity, List<String> allPermissions, List<String> grantedPermissions,
159+
boolean all, OnPermissionCallback callback) {
160+
if (callback != null) {
161+
callback.onGranted(grantedPermissions, all);
160162
}
161-
callback.onGranted(permissions, all);
162163
}
163164

164165
@Override
165-
public void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
166+
public void deniedPermissions(Activity activity, List<String> allPermissions, List<String> deniedPermissions,
167+
boolean never, OnPermissionCallback callback) {
168+
if (callback != null) {
169+
callback.onDenied(deniedPermissions, never);
170+
}
171+
166172
if (never) {
167-
showPermissionDialog(activity, permissions);
168-
if (callback == null) {
169-
return;
170-
}
171-
callback.onDenied(permissions, never);
173+
showPermissionDialog(activity, deniedPermissions);
172174
return;
173175
}
174176

175-
if (permissions.size() == 1 && Permission.ACCESS_BACKGROUND_LOCATION.equals(permissions.get(0))) {
177+
if (deniedPermissions.size() == 1 && Permission.ACCESS_BACKGROUND_LOCATION.equals(deniedPermissions.get(0))) {
176178
ToastUtils.show("没有授予后台定位权限,请您选择\"始终允许\"");
177179
return;
178180
}
@@ -182,15 +184,17 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
182184
if (callback == null) {
183185
return;
184186
}
185-
callback.onDenied(permissions, never);
187+
callback.onDenied(deniedPermissions, never);
186188
}
187189

188190
/**
189191
* 显示授权对话框
190192
*/
191193
protected void showPermissionDialog(Activity activity, List<String> permissions) {
194+
// 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
192195
new AlertDialog.Builder(activity)
193196
.setTitle("授权提醒")
197+
.setCancelable(false)
194198
.setMessage(getPermissionHint(activity, permissions))
195199
.setPositiveButton("前往授权", new DialogInterface.OnClickListener() {
196200

@@ -200,13 +204,6 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
200204
XXPermissions.startPermissionActivity(activity, permissions);
201205
}
202206
})
203-
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
204-
205-
@Override
206-
public void onClick(DialogInterface dialog, int which) {
207-
dialog.dismiss();
208-
}
209-
})
210207
.show();
211208
}
212209

README.md

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# 权限请求框架
22

3-
![](picture/logo.png)
3+
![](logo.png)
44

55
* 项目地址:[Github](https://github.com/getActivity/XXPermissions)[码云](https://gitee.com/getActivity/XXPermissions)
66

77
* 博文地址:[一句代码搞定权限请求,从未如此简单](https://www.jianshu.com/p/c69ff8a445ed)
88

9-
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](XXPermissions.apk)
9+
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/XXPermissions/releases/download/12.8/XXPermissions.apk)
1010

1111
![](picture/demo_code.png)
1212

@@ -45,7 +45,7 @@ android {
4545
4646
dependencies {
4747
// 权限请求框架:https://github.com/getActivity/XXPermissions
48-
implementation 'com.github.getActivity:XXPermissions:12.6'
48+
implementation 'com.github.getActivity:XXPermissions:12.8'
4949
}
5050
```
5151

@@ -85,6 +85,10 @@ android.enableJetifier = true
8585

8686
```java
8787
XXPermissions.with(this)
88+
// 申请单个权限
89+
.permission(Permission.RECORD_AUDIO)
90+
// 申请多个权限
91+
//.permission(Permission.Group.CALENDAR)
8892
// 申请安装包权限
8993
//.permission(Permission.REQUEST_INSTALL_PACKAGES)
9094
// 申请悬浮窗权限
@@ -93,10 +97,10 @@ XXPermissions.with(this)
9397
//.permission(Permission.NOTIFICATION_SERVICE)
9498
// 申请系统设置权限
9599
//.permission(Permission.WRITE_SETTINGS)
96-
// 申请单个权限
97-
.permission(Permission.RECORD_AUDIO)
98-
// 申请多个权限
99-
.permission(Permission.Group.CALENDAR)
100+
// 设置权限请求拦截器
101+
//.interceptor(new PermissionInterceptor())
102+
// 设置不触发错误检测机制
103+
//.unchecked()
100104
.request(new OnPermissionCallback() {
101105

102106
@Override
@@ -159,6 +163,11 @@ XXPermissions.isPermanentDenied(Activity activity, String... permissions);
159163
XXPermissions.startPermissionActivity(Context context, String... permissions);
160164
XXPermissions.startPermissionActivity(Activity activity, String... permissions);
161165
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
166+
167+
// 设置不触发错误检测机制(全局设置)
168+
XXPermissions.setCheckMode(false);
169+
// 设置权限申请拦截器(全局设置)
170+
XXPermissions.setInterceptor(new IPermissionInterceptor() {});
162171
```
163172

164173
#### 关于权限监听回调参数说明
@@ -177,7 +186,7 @@ XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
177186

178187
| 功能及细节 | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [EasyPermissions](https://github.com/googlesamples/easypermissions) |
179188
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
180-
| 对应版本 | 12.6 | 2.0.3 | 1.6.1 | 1.30.6 | 0.12 | 4.9.1 | 3.0.0 |
189+
| 对应版本 | 12.8 | 2.0.3 | 1.6.1 | 1.30.6 | 0.12 | 4.9.1 | 3.0.0 |
181190
| issues 数 | [![](https://img.shields.io/github/issues/getActivity/XXPermissions.svg)](https://github.com/getActivity/XXPermissions/issues) | [![](https://img.shields.io/github/issues/yanzhenjie/AndPermission.svg)](https://github.com/yanzhenjie/AndPermission/issues) | [![](https://img.shields.io/github/issues/guolindev/PermissionX.svg)](https://github.com/guolindev/PermissionX/issues) | [![](https://img.shields.io/github/issues/Blankj/AndroidUtilCode.svg)](https://github.com/Blankj/AndroidUtilCode/issues) | [![](https://img.shields.io/github/issues/tbruyelle/RxPermissions.svg)](https://github.com/tbruyelle/RxPermissions/issues) | [![](https://img.shields.io/github/issues/permissions-dispatcher/PermissionsDispatcher.svg)](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues) | [![](https://img.shields.io/github/issues/googlesamples/easypermissions.svg)](https://github.com/googlesamples/easypermissions/issues) |
182191
| 框架体积 | 28 KB | 127 KB | 78 KB | 500 KB | 28 KB | 91 KB | 48 KB |
183192
| 安装包权限 ||||||||
@@ -238,7 +247,7 @@ XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
238247

239248
* 如果动态申请的权限有在 `AndroidManifest.xml` 中进行注册,但是设定了不恰当的 `android:maxSdkVersion` 属性值,框架会抛出异常,举个例子:`<uses-permission android:name="xxxx" android:maxSdkVersion="29" />`,这样的设定会导致在 Android 11 (`Build.VERSION.SDK_INT >= 30`)及以上的设备申请权限,系统会认为这个权限没有在清单文件中注册,直接拒绝本次的权限申请,并且也是不会给出任何弹窗和提示,这个问题也是必现的。
240249

241-
* 如果你不需要上面这些检测,可通过设置 `XXPermissions.setDebugMode(false)` 来关闭,但是需要注意的是,我并不建议你去关闭这个检测,因为在 **release 模式** 时它是关闭状态,不需要你手动关闭,而它只在 **debug 模式** 下才会触发这些检测。
250+
* 如果你不需要上面这些检测,可通过调用 `unchecked` 方法来关闭,但是需要注意的是,我并不建议你去关闭这个检测,因为在 **release 模式** 时它是关闭状态,不需要你手动关闭,而它只在 **debug 模式** 下才会触发这些检测。
242251

243252
* 出现这些问题的原因是,我们对这些机制不太熟悉,而如果框架不加以限制,那么引发各种奇奇怪怪的问题出现,作为框架的作者,表示不仅你们很痛苦,作为框架作者表示也很受伤。因为这些问题不是框架导致的,而是调用者的某些操作不规范导致的。我觉得这个问题最好的解决方式是,由框架做统一的检查,因为我是框架的作者,对权限申请这块知识点有**较强的专业能力和足够的经验**,知道什么该做,什么不该做,这样就可以对这些骚操作进行一一拦截。
244253

XXPermissions.apk

-2.8 MB
Binary file not shown.

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.permissions.demo"
88
minSdkVersion 14
99
targetSdkVersion 31
10-
versionCode 1260
11-
versionName "12.6"
10+
versionCode 1280
11+
versionName "12.8"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

app/src/main/java/com/hjq/permissions/demo/AppApplication.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void onCreate() {
2121
// 初始化吐司工具类
2222
ToastUtils.init(this, new WhiteToastStyle());
2323

24-
// 设置权限申请拦截器
24+
// 设置权限申请拦截器(全局设置)
2525
XXPermissions.setInterceptor(new PermissionInterceptor());
2626
}
2727
}

app/src/main/java/com/hjq/permissions/demo/PermissionInterceptor.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
public final class PermissionInterceptor implements IPermissionInterceptor {
2626

2727
// @Override
28-
// public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions) {
28+
// public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> allPermissions) {
2929
// // 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
3030
// new AlertDialog.Builder(activity)
3131
// .setTitle(R.string.common_permission_hint)
@@ -35,7 +35,7 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
3535
// @Override
3636
// public void onClick(DialogInterface dialog, int which) {
3737
// dialog.dismiss();
38-
// PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), PermissionInterceptor.this, callback);
38+
// PermissionFragment.beginRequest(activity, new ArrayList<>(allPermissions), PermissionInterceptor.this, callback);
3939
// }
4040
// })
4141
// .setNegativeButton(R.string.common_permission_denied, new DialogInterface.OnClickListener() {
@@ -49,25 +49,26 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
4949
// }
5050

5151
@Override
52-
public void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
53-
if (callback == null) {
54-
return;
52+
public void grantedPermissions(Activity activity, List<String> allPermissions, List<String> grantedPermissions,
53+
boolean all, OnPermissionCallback callback) {
54+
if (callback != null) {
55+
callback.onGranted(grantedPermissions, all);
5556
}
56-
callback.onGranted(permissions, all);
5757
}
5858

5959
@Override
60-
public void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
60+
public void deniedPermissions(Activity activity, List<String> allPermissions, List<String> deniedPermissions,
61+
boolean never, OnPermissionCallback callback) {
62+
if (callback != null) {
63+
callback.onDenied(deniedPermissions, never);
64+
}
65+
6166
if (never) {
62-
showPermissionDialog(activity, permissions);
63-
if (callback == null) {
64-
return;
65-
}
66-
callback.onDenied(permissions, never);
67+
showPermissionDialog(activity, deniedPermissions);
6768
return;
6869
}
6970

70-
if (permissions.size() == 1 && Permission.ACCESS_BACKGROUND_LOCATION.equals(permissions.get(0))) {
71+
if (deniedPermissions.size() == 1 && Permission.ACCESS_BACKGROUND_LOCATION.equals(deniedPermissions.get(0))) {
7172
ToastUtils.show(R.string.common_permission_fail_4);
7273
return;
7374
}
@@ -77,7 +78,7 @@ public void deniedPermissions(Activity activity, OnPermissionCallback callback,
7778
if (callback == null) {
7879
return;
7980
}
80-
callback.onDenied(permissions, never);
81+
callback.onDenied(deniedPermissions, never);
8182
}
8283

8384
/**

library/build.gradle

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ android {
55

66
defaultConfig {
77
minSdkVersion 11
8-
versionCode 1260
9-
versionName "12.6"
8+
versionCode 1280
9+
versionName "12.8"
1010
}
1111

1212
// 使用 JDK 1.8
@@ -25,6 +25,11 @@ android {
2525
outputFileName = "${rootProject.name}-${android.defaultConfig.versionName}.aar"
2626
}
2727
}
28+
29+
packagingOptions {
30+
// 剔除这个包下的所有文件(不会移除签名信息)
31+
exclude 'META-INF/*******'
32+
}
2833
}
2934

3035
afterEvaluate {
@@ -40,6 +45,15 @@ dependencies {
4045
implementation 'com.android.support:support-fragment:24.2.0'
4146
}
4247

48+
task makeJar(type: Copy) {
49+
delete 'build/TestJar_V1.0.jar' //删除之前的旧jar包
50+
from('build/intermediates/bundles/default/') //从这个目录下取出默认jar包
51+
into('build/') //将jar包输出到指定目录下
52+
include('classes.jar')
53+
rename('classes.jar', 'TestJar_V1.0.jar') //自定义jar包的名字
54+
}
55+
makeJar.dependsOn(build)
56+
4357
tasks.withType(Javadoc) {
4458
options.addStringOption('Xdoclint:none', '-quiet')
4559
options.addStringOption('encoding', 'UTF-8')

library/src/main/java/com/hjq/permissions/IPermissionInterceptor.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,31 @@ public interface IPermissionInterceptor {
1616
/**
1717
* 权限申请拦截,可在此处先弹 Dialog 再申请权限
1818
*/
19-
default void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions) {
20-
PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), this, callback);
19+
default void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> allPermissions) {
20+
PermissionFragment.beginRequest(activity, new ArrayList<>(allPermissions), this, callback);
2121
}
2222

2323
/**
2424
* 权限授予回调拦截,参见 {@link OnPermissionCallback#onGranted(List, boolean)}
2525
*/
26-
default void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
26+
default void grantedPermissions(Activity activity, List<String> allPermissions,
27+
List<String> grantedPermissions, boolean all,
28+
OnPermissionCallback callback) {
2729
if (callback == null) {
2830
return;
2931
}
30-
callback.onGranted(permissions, all);
32+
callback.onGranted(grantedPermissions, all);
3133
}
3234

3335
/**
3436
* 权限拒绝回调拦截,参见 {@link OnPermissionCallback#onDenied(List, boolean)}
3537
*/
36-
default void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
38+
default void deniedPermissions(Activity activity, List<String> allPermissions,
39+
List<String> deniedPermissions, boolean never,
40+
OnPermissionCallback callback) {
3741
if (callback == null) {
3842
return;
3943
}
40-
callback.onDenied(permissions, never);
44+
callback.onDenied(deniedPermissions, never);
4145
}
4246
}

0 commit comments

Comments
 (0)