Skip to content

Commit 2e54b24

Browse files
committed
优化权限检查机制判断
适配 OPPO 应用权限受阻跳转优化方案
1 parent a2ec232 commit 2e54b24

File tree

8 files changed

+69
-26
lines changed

8 files changed

+69
-26
lines changed

README-en.md

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

77
* project address: [Github](https://github.com/getActivity/XXPermissions)
88

9-
* [Click here to download demo apk directly](https://github.com/getActivity/XXPermissions/releases/download/18.6/XXPermissions.apk)
9+
* [Click here to download demo apk directly](https://github.com/getActivity/XXPermissions/releases/download/18.62/XXPermissions.apk)
1010

1111
![](picture/en/demo_request_permission_activity.jpg) ![](picture/en/demo_request_single_permission.jpg) ![](picture/en/demo_request_group_permission.jpg)
1212

@@ -55,7 +55,7 @@ android {
5555
5656
dependencies {
5757
// Permission request framework:https://github.com/getActivity/XXPermissions
58-
implementation 'com.github.getActivity:XXPermissions:18.6'
58+
implementation 'com.github.getActivity:XXPermissions:18.62'
5959
}
6060
```
6161

@@ -217,7 +217,7 @@ XXPermissions.setInterceptor(new OnPermissionInterceptor() {});
217217

218218
| Adaptation details | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode-PermissionUtils](https://github.com/Blankj/AndroidUtilCode) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [EasyPermissions](https://github.com/googlesamples/easypermissions) |
219219
|:-------------------------------------------------------------:| :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
220-
| Corresponding version | 18.6 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
220+
| Corresponding version | 18.62 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
221221
| Number of 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/permissions-dispatcher/PermissionsDispatcher.svg)](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues) | [![](https://img.shields.io/github/issues/tbruyelle/RxPermissions.svg)](https://github.com/tbruyelle/RxPermissions/issues) | [![](https://img.shields.io/github/issues/googlesamples/easypermissions.svg)](https://github.com/googlesamples/easypermissions/issues) |
222222
| Framework volume | 85 KB | 127 KB | 97 KB | 500 KB | 99 KB | 28 KB | 48 KB |
223223
| Framework Maintenance Status | **In maintenance** | stop maintenance | **In maintenance** | stop maintenance | stop maintenance | stop maintenance | stop maintenance |

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

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

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

1313
![](picture/zh/download_demo_apk_qr_code.png)
1414

@@ -61,7 +61,7 @@ android {
6161
6262
dependencies {
6363
// 权限请求框架:https://github.com/getActivity/XXPermissions
64-
implementation 'com.github.getActivity:XXPermissions:18.6'
64+
implementation 'com.github.getActivity:XXPermissions:18.62'
6565
}
6666
```
6767

@@ -223,7 +223,7 @@ XXPermissions.setInterceptor(new OnPermissionInterceptor() {});
223223

224224
| 适配细节 | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode-PermissionUtils](https://github.com/Blankj/AndroidUtilCode) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [EasyPermissions](https://github.com/googlesamples/easypermissions) |
225225
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
226-
| 对应版本 | 18.6 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
226+
| 对应版本 | 18.62 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
227227
| 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/permissions-dispatcher/PermissionsDispatcher.svg)](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues) | [![](https://img.shields.io/github/issues/tbruyelle/RxPermissions.svg)](https://github.com/tbruyelle/RxPermissions/issues) | [![](https://img.shields.io/github/issues/googlesamples/easypermissions.svg)](https://github.com/googlesamples/easypermissions/issues) |
228228
| 框架体积 | 85 KB | 127 KB | 97 KB | 500 KB | 99 KB | 28 KB | 48 KB |
229229
| 框架维护状态 |**维护中**| 停止维护 | 停止维护 | 停止维护 | 停止维护 | 停止维护 | 停止维护 |

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 16
99
targetSdkVersion 34
10-
versionCode 1806
11-
versionName "18.6"
10+
versionCode 1862
11+
versionName "18.62"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

library/build.gradle

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

66
defaultConfig {
77
minSdkVersion 14
8-
versionCode 1806
9-
versionName "18.6"
8+
versionCode 1862
9+
versionName "18.62"
1010
}
1111

1212
// 使用 JDK 1.8

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

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ static void checkMediaLocationPermission(@NonNull Context context, @NonNull List
121121
for (String permission : requestPermissions) {
122122
if (PermissionUtils.equalsPermission(permission, Permission.ACCESS_MEDIA_LOCATION)
123123
|| PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_IMAGES)
124+
|| PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_VIDEO)
124125
|| PermissionUtils.equalsPermission(permission, Permission.READ_EXTERNAL_STORAGE)
125126
|| PermissionUtils.equalsPermission(permission, Permission.WRITE_EXTERNAL_STORAGE)
126127
|| PermissionUtils.equalsPermission(permission, Permission.MANAGE_EXTERNAL_STORAGE)) {
@@ -134,9 +135,10 @@ static void checkMediaLocationPermission(@NonNull Context context, @NonNull List
134135

135136
if (AndroidVersion.getTargetSdkVersionCode(context) >= AndroidVersion.ANDROID_13) {
136137
if (!PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_IMAGES) &&
138+
!PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_VIDEO) &&
137139
!PermissionUtils.containsPermission(requestPermissions, Permission.MANAGE_EXTERNAL_STORAGE)) {
138-
// 你需要在外层手动添加 READ_MEDIA_IMAGES 或者 MANAGE_EXTERNAL_STORAGE 才可以申请 ACCESS_MEDIA_LOCATION 权限
139-
throw new IllegalArgumentException("You must add " + Permission.READ_MEDIA_IMAGES + " or " +
140+
// 你需要在外层手动添加 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、MANAGE_EXTERNAL_STORAGE 任一权限才可以申请 ACCESS_MEDIA_LOCATION 权限
141+
throw new IllegalArgumentException("You must add " + Permission.READ_MEDIA_IMAGES + " or " + Permission.READ_MEDIA_VIDEO + " or " +
140142
Permission.MANAGE_EXTERNAL_STORAGE + " rights to apply for " + Permission.ACCESS_MEDIA_LOCATION + " rights");
141143
}
142144
} else {
@@ -173,13 +175,39 @@ static void checkStoragePermission(@NonNull Context context, @NonNull List<Strin
173175
" instead of " + Permission.READ_EXTERNAL_STORAGE);
174176
}
175177

176-
// 如果申请的是 Android 13 读取媒体权限,则绕过本次检查
177178
if (PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_IMAGES) ||
178179
PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_VIDEO) ||
179180
PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_AUDIO)) {
181+
182+
if (PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE) ||
183+
PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE)) {
184+
// 检测是否有旧版的存储权限,有的话直接抛出异常,请不要自己动态申请这两个权限
185+
// 框架会在 Android 13 以下的版本上自动添加并申请这两个权限
186+
throw new IllegalArgumentException("If you have applied for media permissions, " +
187+
"do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions");
188+
}
189+
190+
if (PermissionUtils.containsPermission(requestPermissions, Permission.MANAGE_EXTERNAL_STORAGE)) {
191+
// 因为 MANAGE_EXTERNAL_STORAGE 权限范围很大,有了它就可以读取媒体文件,不需要再叠加申请媒体权限
192+
throw new IllegalArgumentException("Because the MANAGE_EXTERNAL_STORAGE permission range is very large, "
193+
+ "you can read media files with it, and there is no need to apply for additional media permissions.");
194+
}
195+
196+
// 到此结束,不需要往下走是否有分区存储的判断
180197
return;
181198
}
182199

200+
if (PermissionUtils.containsPermission(requestPermissions, Permission.MANAGE_EXTERNAL_STORAGE)) {
201+
202+
if (PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE) ||
203+
PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE)) {
204+
// 检测是否有旧版的存储权限,有的话直接抛出异常,请不要自己动态申请这两个权限
205+
// 框架会在 Android 10 以下的版本上自动添加并申请这两个权限
206+
throw new IllegalArgumentException("If you have applied for MANAGE_EXTERNAL_STORAGE permissions, " +
207+
"do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions");
208+
}
209+
}
210+
183211
// 如果申请的是 Android 10 获取媒体位置权限,则绕过本次检查
184212
if (PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_MEDIA_LOCATION)) {
185213
return;
@@ -683,18 +711,15 @@ static void optimizeDeprecatedPermission(@NonNull List<String> requestPermission
683711
// 如果本次申请包含了 Android 11 存储权限
684712
if (PermissionUtils.containsPermission(requestPermissions, Permission.MANAGE_EXTERNAL_STORAGE)) {
685713

686-
if (PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE) ||
687-
PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE)) {
688-
// 检测是否有旧版的存储权限,有的话直接抛出异常,请不要自己动态申请这两个权限
689-
// 框架会在 Android 10 以下的版本上自动添加并申请这两个权限
690-
throw new IllegalArgumentException("If you have applied for MANAGE_EXTERNAL_STORAGE permissions, " +
691-
"do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions");
692-
}
693-
694714
if (!AndroidVersion.isAndroid11()) {
695715
// 自动添加旧版的存储权限,因为旧版的系统不支持申请新版的存储权限
696-
requestPermissions.add(Permission.READ_EXTERNAL_STORAGE);
697-
requestPermissions.add(Permission.WRITE_EXTERNAL_STORAGE);
716+
if (!PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE)) {
717+
requestPermissions.add(Permission.READ_EXTERNAL_STORAGE);
718+
}
719+
720+
if (!PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE)) {
721+
requestPermissions.add(Permission.WRITE_EXTERNAL_STORAGE);
722+
}
698723
}
699724
}
700725

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.net.VpnService;
77
import android.support.annotation.NonNull;
88
import android.support.annotation.RequiresApi;
9+
import java.util.Collections;
910

1011
/**
1112
* author : Android 轮子哥
@@ -37,7 +38,7 @@ public Intent getPermissionIntent(@NonNull Context context, @NonNull String perm
3738
return getVpnPermissionIntent(context);
3839
}
3940

40-
return PermissionIntentManager.getApplicationDetailsIntent(context);
41+
return PermissionIntentManager.getApplicationDetailsIntent(context, Collections.singletonList(permission));
4142
}
4243

4344
/**

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import android.provider.Settings;
77
import android.support.annotation.NonNull;
88
import android.support.annotation.Nullable;
9+
import java.util.ArrayList;
10+
import java.util.List;
911

1012
/**
1113
* author : Android 轮子哥
@@ -276,13 +278,28 @@ static Intent getVivoMobileManagerAppIntent(Context context) {
276278

277279
/* ---------------------------------------------------------------------------------------- */
278280

281+
@NonNull
282+
static Intent getApplicationDetailsIntent(@NonNull Context context) {
283+
return getApplicationDetailsIntent(context, null);
284+
}
285+
279286
/**
280287
* 获取应用详情界面意图
281288
*/
282289
@NonNull
283-
static Intent getApplicationDetailsIntent(@NonNull Context context) {
290+
static Intent getApplicationDetailsIntent(@NonNull Context context, @Nullable List<String> permissions) {
284291
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
285292
intent.setData(PermissionUtils.getPackageNameUri(context));
293+
if (permissions != null && !permissions.isEmpty() && PhoneRomUtils.isColorOs()) {
294+
// OPPO 应用权限受阻跳转优化适配:https://open.oppomobile.com/new/developmentDoc/info?id=12983
295+
Bundle bundle = new Bundle();
296+
// 元素为受阻权限的原生权限名字符串常量
297+
bundle.putStringArrayList("permissionList", permissions instanceof ArrayList ?
298+
(ArrayList<String>) permissions : new ArrayList<>(permissions));
299+
intent.putExtras(bundle);
300+
// 传入跳转优化标识
301+
intent.putExtra("isGetPermission", true);
302+
}
286303
if (PermissionUtils.areActivityIntent(context, intent)) {
287304
return intent;
288305
}

0 commit comments

Comments
 (0)