Skip to content

Commit 25a9ce2

Browse files
committed
修正 Android 13 媒体权限向下兼容的方式
1 parent 69cebab commit 25a9ce2

File tree

8 files changed

+54
-43
lines changed

8 files changed

+54
-43
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/16.6/XXPermissions.apk)
9+
* [Click here to download demo apk directly](https://github.com/getActivity/XXPermissions/releases/download/16.8/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:16.6'
58+
implementation 'com.github.getActivity:XXPermissions:16.8'
5959
}
6060
```
6161

@@ -209,7 +209,7 @@ XXPermissions.setInterceptor(new IPermissionInterceptor() {});
209209

210210
| 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) |
211211
| :-----------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
212-
| Corresponding version | 16.6 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
212+
| Corresponding version | 16.8 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
213213
| 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) |
214214
| Framework volume | 60 KB | 127 KB | 97 KB | 500 KB | 99 KB | 28 KB | 48 KB |
215215
| 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/16.6/XXPermissions.apk)
11+
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/XXPermissions/releases/download/16.8/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:16.6'
64+
implementation 'com.github.getActivity:XXPermissions:16.8'
6565
}
6666
```
6767

@@ -215,7 +215,7 @@ XXPermissions.setInterceptor(new IPermissionInterceptor() {});
215215

216216
| 适配细节 | [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) |
217217
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
218-
| 对应版本 | 16.6 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
218+
| 对应版本 | 16.8 | 2.0.3 | 1.7.1 | 1.31.0 | 4.9.2 | 0.12 | 3.0.0 |
219219
| 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) |
220220
| 框架体积 | 60 KB | 127 KB | 97 KB | 500 KB | 99 KB | 28 KB | 48 KB |
221221
| 框架维护状态 |**维护中**| 停止维护 | 停止维护 | 停止维护 | 停止维护 | 停止维护 | 停止维护 |

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 33
10-
versionCode 1660
11-
versionName "16.6"
10+
versionCode 1680
11+
versionName "16.8"
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 1660
9-
versionName "16.6"
8+
versionCode 1680
9+
versionName "16.8"
1010
}
1111

1212
// 使用 JDK 1.8

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

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,12 @@ static void checkStoragePermission(@NonNull Context context, @NonNull List<Strin
166166
}
167167

168168
if (AndroidVersion.getTargetSdkVersionCode(context) >= AndroidVersion.ANDROID_13 &&
169-
(PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE) ||
170-
PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE))) {
171-
// 当 targetSdkVersion >= 33 应该使用 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 来代替 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE
169+
PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE)) {
170+
// 当 targetSdkVersion >= 33 应该使用 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO 来代替 READ_EXTERNAL_STORAGE
172171
// 因为经过测试,如果当 targetSdkVersion >= 33 申请 READ_EXTERNAL_STORAGE 或者 WRITE_EXTERNAL_STORAGE 会被系统直接拒绝,不会弹出任何授权框
173172
throw new IllegalArgumentException("When targetSdkVersion >= 33 should use " +
174173
Permission.READ_MEDIA_IMAGES + ", " + Permission.READ_MEDIA_VIDEO + ", " + Permission.READ_MEDIA_AUDIO +
175-
" instead of " + Permission.READ_EXTERNAL_STORAGE + ", " + Permission.WRITE_EXTERNAL_STORAGE);
174+
" instead of " + Permission.READ_EXTERNAL_STORAGE);
176175
}
177176

178177
// 如果申请的是 Android 13 读取照片权限,则绕过本次检查
@@ -260,23 +259,25 @@ static void checkBodySensorsPermission(@NonNull List<String> requestPermissions)
260259
* 检查定位权限
261260
*/
262261
static void checkLocationPermission(@NonNull List<String> requestPermissions) {
263-
// 为什么要注释这段代码,因为经过测试,没有官方说得那么严重,我用 Android 模拟器做测试
264-
// 愣是没测出来只申请 ACCESS_FINE_LOCATION 会有什么异常,估计是 Google 将代码改回去了,但是文档忘记改了
265-
// 总结出来:耳听为虚,眼见不一定为实,要自己动手实践,实践出真理,光说不练假把式
266-
// if (AndroidVersion.getTargetSdkVersionCode(context) >= AndroidVersion.ANDROID_12) {
267-
// if (PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_FINE_LOCATION) &&
268-
// !PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_COARSE_LOCATION) ) {
269-
// // 如果您的应用以 Android 12 为目标平台并且您请求 ACCESS_FINE_LOCATION 权限
270-
// // 则还必须请求 ACCESS_COARSE_LOCATION 权限。您必须在单个运行时请求中包含这两项权限
271-
// // 如果您尝试仅请求 ACCESS_FINE_LOCATION,则系统会忽略该请求并在 Logcat 中记录以下错误消息:
272-
// // ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION
273-
// // 官方适配文档:https://developer.android.google.cn/about/versions/12/approximate-location
274-
// throw new IllegalArgumentException("If your app targets Android 12 or higher " +
275-
// "and requests the ACCESS_FINE_LOCATION runtime permission, " +
276-
// "you must also request the ACCESS_COARSE_LOCATION permission. " +
277-
// "You must include both permissions in a single runtime request.");
278-
// }
279-
// }
262+
/*
263+
为什么要注释这段代码,因为经过测试,没有官方说得那么严重,我用 Android 模拟器做测试
264+
愣是没测出来只申请 ACCESS_FINE_LOCATION 会有什么异常,估计是 Google 将代码改回去了,但是文档忘记改了
265+
总结出来:耳听为虚,眼见不一定为实,要自己动手实践,实践出真理,光说不练假把式
266+
if (AndroidVersion.getTargetSdkVersionCode(context) >= AndroidVersion.ANDROID_12) {
267+
if (PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_FINE_LOCATION) &&
268+
!PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_COARSE_LOCATION) ) {
269+
// 如果您的应用以 Android 12 为目标平台并且您请求 ACCESS_FINE_LOCATION 权限
270+
// 则还必须请求 ACCESS_COARSE_LOCATION 权限。您必须在单个运行时请求中包含这两项权限
271+
// 如果您尝试仅请求 ACCESS_FINE_LOCATION,则系统会忽略该请求并在 Logcat 中记录以下错误消息:
272+
// ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION
273+
// 官方适配文档:https://developer.android.google.cn/about/versions/12/approximate-location
274+
throw new IllegalArgumentException("If your app targets Android 12 or higher " +
275+
"and requests the ACCESS_FINE_LOCATION runtime permission, " +
276+
"you must also request the ACCESS_COARSE_LOCATION permission. " +
277+
"You must include both permissions in a single runtime request.");
278+
}
279+
}
280+
*/
280281

281282
// 判断是否包含后台定位权限
282283
if (!PermissionUtils.containsPermission(requestPermissions, Permission.ACCESS_BACKGROUND_LOCATION)) {
@@ -529,7 +530,6 @@ static void checkManifestPermissions(@NonNull Context context, @NonNull List<Str
529530
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_VIDEO) ||
530531
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_AUDIO)) {
531532
checkManifestPermission(permissionInfoList, Permission.READ_EXTERNAL_STORAGE, AndroidVersion.ANDROID_12_L);
532-
checkManifestPermission(permissionInfoList, Permission.WRITE_EXTERNAL_STORAGE, AndroidVersion.ANDROID_12_L);
533533
continue;
534534
}
535535

@@ -661,14 +661,10 @@ static void optimizeDeprecatedPermission(@NonNull List<String> requestPermission
661661
PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_VIDEO) ||
662662
PermissionUtils.containsPermission(requestPermissions, Permission.READ_MEDIA_AUDIO))) {
663663

664-
// 添加旧版的存储权限
664+
// 添加旧版的读取外部存储权限
665665
if (!PermissionUtils.containsPermission(requestPermissions, Permission.READ_EXTERNAL_STORAGE)) {
666666
requestPermissions.add(Permission.READ_EXTERNAL_STORAGE);
667667
}
668-
669-
if (!PermissionUtils.containsPermission(requestPermissions, Permission.WRITE_EXTERNAL_STORAGE)) {
670-
requestPermissions.add(Permission.WRITE_EXTERNAL_STORAGE);
671-
}
672668
}
673669
}
674670

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ public boolean isGrantedPermission(@NonNull Context context, @NonNull String per
7878
if (PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_IMAGES) ||
7979
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_VIDEO) ||
8080
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_AUDIO)) {
81-
return PermissionUtils.checkSelfPermission(context, Permission.READ_EXTERNAL_STORAGE) &&
82-
PermissionUtils.checkSelfPermission(context, Permission.WRITE_EXTERNAL_STORAGE);
81+
return PermissionUtils.checkSelfPermission(context, Permission.READ_EXTERNAL_STORAGE);
8382
}
8483
}
8584

@@ -148,7 +147,7 @@ public boolean isGrantedPermission(@NonNull Context context, @NonNull String per
148147
// 如果支持申请,那么再去判断权限是否授予
149148
return PermissionUtils.checkSelfPermission(context, permission);
150149
}
151-
// 如果不支持申请,则直接返回 true(代表有这个权限),反正也不会崩溃,顶多就是获取不到其他应用列表
150+
// 如果不支持申请,则直接返回 true(代表有这个权限),反正也不会崩溃,顶多就是获取不到第三方应用列表
152151
return true;
153152
}
154153

@@ -187,9 +186,7 @@ public boolean isPermissionPermanentDenied(@NonNull Activity activity, @NonNull
187186
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_VIDEO) ||
188187
PermissionUtils.equalsPermission(permission, Permission.READ_MEDIA_AUDIO)) {
189188
return !PermissionUtils.checkSelfPermission(activity, Permission.READ_EXTERNAL_STORAGE) &&
190-
!PermissionUtils.shouldShowRequestPermissionRationale(activity, Permission.READ_EXTERNAL_STORAGE) &&
191-
!PermissionUtils.checkSelfPermission(activity, Permission.WRITE_EXTERNAL_STORAGE) &&
192-
!PermissionUtils.shouldShowRequestPermissionRationale(activity, Permission.WRITE_EXTERNAL_STORAGE);
189+
!PermissionUtils.shouldShowRequestPermissionRationale(activity, Permission.READ_EXTERNAL_STORAGE);
193190
}
194191
}
195192

0 commit comments

Comments
 (0)