Skip to content

Commit e6d3bf6

Browse files
committed
修正权限回调不正确的问题
优化权限请求拦截器相关的逻辑 剔除自动生成的 BuildConfig 类 补充部分权限常量字段相关注释介绍
1 parent a047b5c commit e6d3bf6

File tree

13 files changed

+155
-76
lines changed

13 files changed

+155
-76
lines changed

HelpDoc.md

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
* [什么情况下需要适配分区存储特性](#什么情况下需要适配分区存储特性)
88

9+
* [为什么授予了存储权限但是权限设置页还是显示未授权](#为什么授予了存储权限但是权限设置页还是显示未授权)
10+
911
* [我想在申请前和申请后统一弹对话框该怎么处理](#我想在申请前和申请后统一弹对话框该怎么处理)
1012

1113
* [如何在回调中判断哪些权限被永久拒绝了](#如何在回调中判断哪些权限被永久拒绝了)
@@ -112,6 +114,12 @@ XXPermissions.with(this)
112114

113115
2. 如果你的应用只上架国内的应用市场,并且后续也没有上架谷歌应用市场的需要,那么你也可以直接申请 `MANAGE_EXTERNAL_STORAGE` 权限来读写外部存储
114116

117+
#### 为什么授予了存储权限但是权限设置页还是显示未授权
118+
119+
* 首先我需要先纠正大家一个错误的想法,`READ_EXTERNAL_STORAGE``WRITE_EXTERNAL_STORAGE` 这两个权限和 `MANAGE_EXTERNAL_STORAGE` 权限是两码事,虽然都叫存储权限,但是属于两种完全不同的权限,你如果申请的是 `MANAGE_EXTERNAL_STORAGE` 权限,并且授予了权限,但是在权限设置页并没有看到已授予,请注意这种情况是正常的,因为你在权限设置页看到的是存储授予状态是 `READ_EXTERNAL_STORAGE``WRITE_EXTERNAL_STORAGE` 权限状态的,而不是 `MANAGE_EXTERNAL_STORAGE` 权限状态的,但是这个时候已经获取到存储权限了,你大可不必管权限设置页显示的权限状态,直接读写文件即可,不会有权限问题的。
120+
121+
* 还有一个问题,为什么只在 Android 11 以上的设备出现?首先 `MANAGE_EXTERNAL_STORAGE` 权限是 Android 11 才有权限,Android 10 及之前的版本是没有这个权限的,你如果在低版本设备上申请了 `MANAGE_EXTERNAL_STORAGE` 权限,那么框架会帮你做向下兼容,会自动帮你替换成 `READ_EXTERNAL_STORAGE``WRITE_EXTERNAL_STORAGE` 权限去申请,这个时候你看到权限设置页的存储权限状态肯定是正常的,这就是为什么你只在 Android 11 以上的设备才会看到这个问题。
122+
115123
#### 我想在申请前和申请后统一弹对话框该怎么处理
116124

117125
* 在 Application 初始化的时候配置
@@ -131,7 +139,7 @@ public class XxxApplication extends Application {
131139
* PermissionInterceptor 源码实现
132140

133141
```java
134-
public class PermissionInterceptor implements IPermissionInterceptor {
142+
public final class PermissionInterceptor implements IPermissionInterceptor {
135143

136144
@Override
137145
public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions) {
@@ -143,7 +151,7 @@ public class PermissionInterceptor implements IPermissionInterceptor {
143151
@Override
144152
public void onClick(DialogInterface dialog, int which) {
145153
dialog.dismiss();
146-
PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), callback);
154+
PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), PermissionInterceptor.this, callback);
147155
}
148156
})
149157
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@@ -158,14 +166,15 @@ public class PermissionInterceptor implements IPermissionInterceptor {
158166

159167
@Override
160168
public void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
169+
if (callback == null) {
170+
return;
171+
}
161172
// 回调授权成功的方法
162173
callback.onGranted(permissions, all);
163174
}
164175

165176
@Override
166177
public void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
167-
// 回调授权失败的方法
168-
callback.onDenied(permissions, never);
169178
if (never) {
170179
showPermissionDialog(activity, permissions);
171180
return;
@@ -177,6 +186,12 @@ public class PermissionInterceptor implements IPermissionInterceptor {
177186
}
178187

179188
ToastUtils.show("授权失败,请正确授予权限");
189+
190+
if (callback == null) {
191+
return;
192+
}
193+
// 回调授权失败的方法
194+
callback.onDenied(permissions, never);
180195
}
181196

182197
/**
@@ -326,5 +341,4 @@ public class PermissionActivity extends AppCompatActivity implements OnPermissio
326341

327342
* 另外值得一提的是 [Android 11 对软件包可见性进行了限制](https://developer.android.google.cn/about/versions/11/privacy/package-visibility),所以这种跳包名的方式在未来将会完全不可行。
328343

329-
* 最终决定:这个功能的出发点是好的,但是我们没办法做好它,经过慎重考虑,决定将这个功能在 XXPermissions 9.2 版本及之后的版本进行移除。
330-
344+
* 最终决定:这个功能的出发点是好的,但是我们没办法做好它,经过慎重考虑,决定将这个功能在 XXPermissions 9.2 版本及之后的版本进行移除。

README.md

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![](picture/logo.png)
44

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

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

@@ -43,7 +43,7 @@ android {
4343
4444
dependencies {
4545
// 权限请求框架:https://github.com/getActivity/XXPermissions
46-
implementation 'com.github.getActivity:XXPermissions:11.6'
46+
implementation 'com.github.getActivity:XXPermissions:11.8'
4747
}
4848
```
4949

@@ -151,20 +151,21 @@ public class XxxActivity extends AppCompatActivity {
151151

152152
| 功能及细节 | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [EasyPermissions](https://github.com/googlesamples/easypermissions) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) |
153153
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
154-
| 对应版本 | 11.6 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
155-
| 框架体积 | [28 KB](https://bintray.com/getactivity/maven/xxpermissions#files/com/hjq/xxpermissions) | [127 KB](https://mvnrepository.com/artifact/com.yanzhenjie/permission) | [28 KB](https://jitpack.io/#com.github.tbruyelle/rxpermissions) | [91 KB](https://bintray.com/hotchemi/org.permissionsdispatcher/permissionsdispatcher-processor#files/org/permissionsdispatcher/permissionsdispatcher-processor) | [48 KB](https://bintray.com/easygoogle/EasyPermissions/easypermissions#files/pub/devrel/easypermissions) | [32 KB](https://bintray.com/guolindev/maven/permissionx#files/com/permissionx/guolindev/permissionx) | [483 KB](https://bintray.com/blankj/maven/UtilCode#files/com/blankj/utilcode) |
156-
| 安装包权限 ||||||||
157-
| 悬浮窗权限 ||||||||
158-
| 通知栏权限 ||||||||
159-
| 系统设置权限 ||||||||
160-
| Android 8.0 权限适配 ||||||||
161-
| Android 9.0 权限适配 ||||||||
162-
| Android 10.0 权限适配 ||||||||
163-
| Android 11 新版存储权限 ||||||||
164-
| Android 11 新版定位策略 ||||||||
165-
| 屏幕方向旋转场景适配 ||||||||
166-
| 后台申请权限场景适配 ||||||||
167-
| 低级错误检测机制 ||||||||
154+
| 对应版本 | 11.8 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.5.0 | 1.30.6 |
155+
| 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/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) | [![](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) |
156+
| 框架体积 | 27 KB | 127 KB | 28 KB | 91 KB | 48 KB | 66 KB | 500 KB |
157+
| 安装包权限 ||||||||
158+
| 悬浮窗权限 ||||||||
159+
| 通知栏权限 ||||||||
160+
| 系统设置权限 ||||||||
161+
| Android 8.0 权限适配 ||||||||
162+
| Android 9.0 权限适配 ||||||||
163+
| Android 10.0 权限适配 ||||||||
164+
| Android 11 新版存储权限 ||||||||
165+
| Android 11 新版定位策略 ||||||||
166+
| 屏幕方向旋转场景适配 ||||||||
167+
| 后台申请权限场景适配 ||||||||
168+
| 低级错误检测机制 ||||||||
168169

169170
#### 屏幕旋转场景适配介绍
170171

@@ -196,7 +197,7 @@ public class XxxActivity extends AppCompatActivity {
196197

197198
#### 框架亮点
198199

199-
* 首款也是唯一一款适配 Android 11 的权限请求框架
200+
* 首款适配 Android 11 的权限请求框架
200201

201202
* 首款也是唯一一款适配所有 Android 版本的权限请求框架
202203

@@ -224,6 +225,8 @@ public class XxxActivity extends AppCompatActivity {
224225

225226
* 悬浮窗框架:[XToast](https://github.com/getActivity/XToast)
226227

228+
* Shape 框架:[ShapeView](https://github.com/getActivity/ShapeView)
229+
227230
* Gson 解析容错:[GsonFactory](https://github.com/getActivity/GsonFactory)
228231

229232
* 日志查看框架:[Logcat](https://github.com/getActivity/Logcat)

XXPermissions.apk

336 Bytes
Binary file not shown.

app/AppSignature.jks

2.13 KB
Binary file not shown.

app/build.gradle

Lines changed: 14 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 30
10-
versionCode 1160
11-
versionName "11.6"
10+
versionCode 1180
11+
versionName "11.8"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

@@ -18,15 +18,27 @@ android {
1818
sourceCompatibility JavaVersion.VERSION_1_8
1919
}
2020

21+
// Apk 签名的那些事:https://www.jianshu.com/p/a1f8e5896aa2
22+
signingConfigs {
23+
config {
24+
storeFile file(StoreFile)
25+
storePassword StorePassword
26+
keyAlias KeyAlias
27+
keyPassword KeyPassword
28+
}
29+
}
30+
2131
buildTypes {
2232
debug {
2333
minifyEnabled false
2434
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
35+
signingConfig signingConfigs.config
2536
}
2637

2738
release {
2839
minifyEnabled true
2940
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
41+
signingConfig signingConfigs.config
3042
}
3143
}
3244
}

app/gradle.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
StoreFile = AppSignature.jks
2+
StorePassword = AndroidProject
3+
KeyAlias = AndroidProject
4+
KeyPassword = AndroidProject

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.hjq.permissions.IPermissionInterceptor;
1010
import com.hjq.permissions.OnPermissionCallback;
1111
import com.hjq.permissions.Permission;
12+
import com.hjq.permissions.PermissionFragment;
1213
import com.hjq.permissions.XXPermissions;
1314
import com.hjq.toast.ToastUtils;
1415

@@ -34,7 +35,7 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
3435
// @Override
3536
// public void onClick(DialogInterface dialog, int which) {
3637
// dialog.dismiss();
37-
// PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), callback);
38+
// PermissionFragment.beginRequest(activity, new ArrayList<>(permissions), PermissionInterceptor.this, callback);
3839
// }
3940
// })
4041
// .setNegativeButton(R.string.common_permission_denied, new DialogInterface.OnClickListener() {
@@ -49,14 +50,15 @@ public final class PermissionInterceptor implements IPermissionInterceptor {
4950

5051
@Override
5152
public void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
53+
if (callback == null) {
54+
return;
55+
}
5256
// 回调授权失败的方法
5357
callback.onGranted(permissions, all);
5458
}
5559

5660
@Override
5761
public void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
58-
// 回调授权失败的方法
59-
callback.onDenied(permissions, never);
6062
if (never) {
6163
showPermissionDialog(activity, permissions);
6264
return;
@@ -68,6 +70,12 @@ public void deniedPermissions(Activity activity, OnPermissionCallback callback,
6870
}
6971

7072
ToastUtils.show(R.string.common_permission_fail_1);
73+
74+
if (callback == null) {
75+
return;
76+
}
77+
// 回调授权失败的方法
78+
callback.onDenied(permissions, never);
7179
}
7280

7381
/**

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ allprojects {
2828
// noinspection JcenterRepositoryObsolete
2929
jcenter()
3030
}
31+
32+
// 将构建文件统一输出到项目根目录下的 build 文件夹
33+
setBuildDir(new File(rootDir, "build/${path.replaceAll(':', '/')}"))
3134
}
3235

3336
task clean(type: Delete) {

library/build.gradle

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

66
defaultConfig {
77
minSdkVersion 11
8-
versionCode 1160
9-
versionName "11.6"
8+
versionCode 1180
9+
versionName "11.8"
1010
}
1111

1212
// 使用 JDK 1.8
@@ -22,11 +22,19 @@ android {
2222
android.libraryVariants.all { variant ->
2323
// aar 输出文件名配置
2424
variant.outputs.all { output ->
25-
outputFileName = "xxpermissions-${android.defaultConfig.versionName}.aar"
25+
outputFileName = "${rootProject.name}-${android.defaultConfig.versionName}.aar"
2626
}
2727
}
2828
}
2929

30+
afterEvaluate {
31+
// 排除 BuildConfig.class 和 R.class
32+
generateReleaseBuildConfig.enabled = false
33+
generateDebugBuildConfig.enabled = false
34+
generateReleaseResValues.enabled = false
35+
generateDebugResValues.enabled = false
36+
}
37+
3038
dependencies {
3139
// noinspection GradleCompatible
3240
implementation 'com.android.support:support-fragment:24.2.0'

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

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

2323
/**
2424
* 权限授予回调拦截,参见 {@link OnPermissionCallback#onGranted(List, boolean)}
2525
*/
2626
default void grantedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean all) {
27+
if (callback == null) {
28+
return;
29+
}
2730
callback.onGranted(permissions, all);
2831
}
2932

3033
/**
3134
* 权限拒绝回调拦截,参见 {@link OnPermissionCallback#onDenied(List, boolean)}
3235
*/
3336
default void deniedPermissions(Activity activity, OnPermissionCallback callback, List<String> permissions, boolean never) {
37+
if (callback == null) {
38+
return;
39+
}
3440
callback.onDenied(permissions, never);
3541
}
3642
}

0 commit comments

Comments
 (0)