Skip to content

Commit a047b5c

Browse files
committed
新增支持自定义权限设置页跳转请求码
优化权限常量注释及抑制项目代码警告
1 parent 00f7fc1 commit a047b5c

File tree

10 files changed

+57
-23
lines changed

10 files changed

+57
-23
lines changed

HelpDoc.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ public class PermissionActivity extends AppCompatActivity implements OnPermissio
308308

309309
* 其实不止华为有问题,小米同样有问题,有很多人跟我反馈过同一个问题,XXPermissions 跳转到国产手机权限设置页,用户正常授予了权限之后返回仍然检测到权限仍然是拒绝的状态,这个问题反馈的次数很多,但是迟迟不能排查到原因,终于在最后一次得到答案了,[有人](https://github.com/getActivity/XXPermissions/issues/38)帮我排查到是 miui 优化开关的问题(小米手机 ---> 开发者选项 ---> 启用 miui 优化),那么问题来了,这个开关有什么作用?是如何影响到 XXPermissions 的?
310310

311-
* 首先这个问题要从 XXPermissions 跳转到国产手机设置页的原理讲起,从谷歌提供的原生 API 我们最多只能跳转到应用详情页,并不能直接跳转到权限设置页,而需要用户在应用详情页再次点击才能进入权限设置页。如果从用户体验的角度上看待这个问题,肯定是直接跳转到权限设置页是最好的,但是这种方式是不受谷歌支持的,当然也有方法实现,网上都有一个通用的答案,就是直接捕获某个品牌手机的权限设置页 `Activity` 包名然后进行跳转。这种想法的起点是好的,但是存在许多问题,并不能保证每个品牌的所有机型都能适配到位,手机产商更改这个 `Activity` 的包名的次数和频率比较高,在最近发布的一些新的华为机型上面几乎已经全部失效,也就是 `startActivity` 的时候会报 `ActivityNotFoundException` 或 `SecurityException ` 异常,当然这些异常是可以被捕捉到的,但是仅仅只能捕获到崩溃,一些非崩溃的行为我们并不能从中得知和处理,例如我刚刚讲过的华为和小米的问题,这些问题并不能导致崩溃,但是会导致功能出现异常。
311+
* 首先这个问题要从 XXPermissions 跳转到国产手机设置页的原理讲起,从谷歌提供的原生 API 我们最多只能跳转到应用详情页,并不能直接跳转到权限设置页,而需要用户在应用详情页再次点击才能进入权限设置页。如果从用户体验的角度上看待这个问题,肯定是直接跳转到权限设置页是最好的,但是这种方式是不受谷歌支持的,当然也有方法实现,网上都有一个通用的答案,就是直接捕获某个品牌手机的权限设置页 `Activity` 包名然后进行跳转。这种想法的起点是好的,但是存在许多问题,并不能保证每个品牌的所有机型都能适配到位,手机产商更改这个 `Activity` 的包名的次数和频率比较高,在最近发布的一些新的华为机型上面几乎已经全部失效,也就是 `startActivity` 的时候会报 `ActivityNotFoundException` 或 `SecurityException` 异常,当然这些异常是可以被捕捉到的,但是仅仅只能捕获到崩溃,一些非崩溃的行为我们并不能从中得知和处理,例如我刚刚讲过的华为和小米的问题,这些问题并不能导致崩溃,但是会导致功能出现异常。
312312

313313
* 而 miui 优化开关是小米工程师预留的切换 miui 和原生的功能开关,例如在这个开关开启的时候,在应用详情页点击权限管理会跳转到小米的权限设置页,如果这个开关是关闭状态(默认是开启状态),在应用详情页点击权限管理会跳转到谷歌原生的权限设置页,具体效果如图:
314314

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ android {
4343
4444
dependencies {
4545
// 权限请求框架:https://github.com/getActivity/XXPermissions
46-
implementation 'com.github.getActivity:XXPermissions:11.5'
46+
implementation 'com.github.getActivity:XXPermissions:11.6'
4747
}
4848
```
4949

@@ -151,8 +151,8 @@ 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.0 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
155-
| 框架体积 | [27 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) |
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) |
156156
| 安装包权限 ||||||||
157157
| 悬浮窗权限 ||||||||
158158
| 通知栏权限 ||||||||

XXPermissions.apk

334 Bytes
Binary file not shown.

app/build.gradle

Lines changed: 3 additions & 3 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 1150
11-
versionName "11.5"
10+
versionCode 1160
11+
versionName "11.6"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

@@ -43,7 +43,7 @@ dependencies {
4343
implementation 'com.android.support:appcompat-v7:28.0.0'
4444

4545
// 吐司框架:https://github.com/getActivity/ToastUtils
46-
implementation 'com.github.getActivity:ToastUtils:9.2'
46+
implementation 'com.github.getActivity:ToastUtils:9.5'
4747

4848
// 内存泄漏检测:https://github.com/square/leakcanary
4949
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ buildscript {
99
maven { url 'https://jitpack.io' }
1010
mavenCentral()
1111
google()
12+
// noinspection JcenterRepositoryObsolete
1213
jcenter()
1314
}
1415
dependencies {
@@ -24,6 +25,7 @@ allprojects {
2425
maven { url 'https://jitpack.io' }
2526
mavenCentral()
2627
google()
28+
// noinspection JcenterRepositoryObsolete
2729
jcenter()
2830
}
2931
}

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 11
8-
versionCode 1150
9-
versionName "11.5"
8+
versionCode 1160
9+
versionName "11.6"
1010
}
1111

1212
// 使用 JDK 1.8

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,22 @@ private Permission() {}
2121
*/
2222
public static final String MANAGE_EXTERNAL_STORAGE = "android.permission.MANAGE_EXTERNAL_STORAGE";
2323

24-
/** 安装应用权限(特殊权限,需要 Android 8.0 及以上) */
24+
/**
25+
* 安装应用权限(特殊权限,需要 Android 8.0 及以上)
26+
*
27+
* Android 11 特性调整,安装外部来源应用需要重启 App:https://cloud.tencent.com/developer/news/637591
28+
*/
2529
public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
2630

2731
/** 通知栏权限(特殊权限,需要 Android 6.0 及以上,注意此权限不需要在清单文件中注册也能申请) */
2832
public static final String NOTIFICATION_SERVICE = "android.permission.NOTIFICATION_SERVICE";
2933

30-
/** 悬浮窗权限(特殊权限,需要 Android 6.0 及以上) */
34+
/**
35+
* 悬浮窗权限(特殊权限,需要 Android 6.0 及以上)
36+
*
37+
* 在 Android 10 及之前的版本能跳转到应用悬浮窗设置页面,而在 Android 11 及之后的版本只能跳转到系统设置悬浮窗管理列表了
38+
* 具体详情请看官方文档解释:https://developer.android.google.cn/reference/android/provider/Settings#ACTION_MANAGE_OVERLAY_PERMISSION
39+
*/
3140
public static final String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW";
3241

3342
/** 系统设置权限(特殊权限,需要 Android 6.0 及以上) */
@@ -66,14 +75,20 @@ private Permission() {}
6675
/**
6776
* 读取照片中的地理位置(需要 Android 10.0 及以上)
6877
*
69-
* 需要注意的是如果这个权限申请成功了但是不能正常读取照片的地理信息,那么需要先申请存储权限:
78+
* 需要注意的是如果这个权限申请成功了但是不能正常读取照片的地理信息,那么需要先申请存储权限:
7079
*
7180
* 如果项目 targetSdkVersion <= 29 需要申请 {@link Permission.Group#STORAGE}
7281
* 如果项目 targetSdkVersion >= 30 需要申请 {@link Permission#MANAGE_EXTERNAL_STORAGE}
7382
*/
7483
public static final String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";
7584

76-
/** 读取电话状态(这个权限在某些手机上面是申请失败的) */
85+
/**
86+
* 读取电话状态
87+
*
88+
* 需要注意的是:这个权限在某些手机上面是没办法获取到的,因为某些系统禁止应用获得该权限
89+
* 所以你要是申请了这个权限之后没有弹授权框,而是直接回调授权失败方法
90+
* 请不要惊慌,这个不是 Bug、不是 Bug、不是 Bug,而是正常现象
91+
*/
7792
public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
7893
/** 拨打电话 */
7994
public static final String CALL_PHONE = "android.permission.CALL_PHONE";

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ static void optimizeDeprecatedPermission(List<String> requestPermissions) {
234234
if (requestPermissions.contains(Permission.READ_EXTERNAL_STORAGE) ||
235235
requestPermissions.contains(Permission.WRITE_EXTERNAL_STORAGE)) {
236236
// 检测是否有旧版的存储权限,有的话直接抛出异常,请不要自己动态申请这两个权限
237-
throw new IllegalArgumentException("Please do not apply for these two permissions dynamically");
237+
throw new IllegalArgumentException("If you have applied for MANAGE_EXTERNAL_STORAGE permissions, " +
238+
"do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions");
238239
}
239240

240241
if (!PermissionUtils.isAndroid11()) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ static <T> ArrayList<T> asArrayList(T... array) {
440440
return list;
441441
}
442442

443+
@SafeVarargs
443444
static <T> ArrayList<T> asArrayLists(T[]... arrays) {
444445
ArrayList<T> list = new ArrayList<>();
445446
if (arrays == null || arrays.length == 0) {

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

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* time : 2018/06/15
1515
* desc : Android 危险权限请求类
1616
*/
17-
@SuppressWarnings("deprecation, unused")
17+
@SuppressWarnings({"unused", "deprecation"})
1818
public final class XXPermissions {
1919

2020
/** 权限设置页跳转请求码 */
@@ -23,10 +23,10 @@ public final class XXPermissions {
2323
/** 权限请求拦截器 */
2424
private static IPermissionInterceptor sPermissionInterceptor;
2525

26-
/** 调试模式 */
26+
/** 当前是否为调试模式 */
2727
private static Boolean sDebugMode;
2828

29-
/** 分区存储 */
29+
/** 是否适配了分区存储 */
3030
private static boolean sScopedStorage;
3131

3232
/**
@@ -270,13 +270,18 @@ public static void startPermissionActivity(Activity activity, String[]... permis
270270
startPermissionActivity(activity, PermissionUtils.asArrayLists(permissions));
271271
}
272272

273+
public static void startPermissionActivity(Activity activity, List<String> permissions) {
274+
startPermissionActivity(activity, permissions, REQUEST_CODE);
275+
}
276+
273277
/**
274278
* 跳转到应用权限设置页
275279
*
276280
* @param permissions 没有授予或者被拒绝的权限组
281+
* @param requestCode Activity 跳转请求码
277282
*/
278-
public static void startPermissionActivity(Activity activity, List<String> permissions) {
279-
activity.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), REQUEST_CODE);
283+
public static void startPermissionActivity(Activity activity, List<String> permissions, int requestCode) {
284+
activity.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), requestCode);
280285
}
281286

282287
/* android.app.Fragment */
@@ -293,17 +298,22 @@ public static void startPermissionActivity(Fragment fragment, String[]... permis
293298
startPermissionActivity(fragment, PermissionUtils.asArrayLists(permissions));
294299
}
295300

301+
public static void startPermissionActivity(Fragment fragment, List<String> permissions) {
302+
startPermissionActivity(fragment, permissions, REQUEST_CODE);
303+
}
304+
296305
/**
297306
* 跳转到应用权限设置页
298307
*
299308
* @param permissions 没有授予或者被拒绝的权限组
309+
* @param requestCode Activity 跳转请求码
300310
*/
301-
public static void startPermissionActivity(Fragment fragment, List<String> permissions) {
311+
public static void startPermissionActivity(Fragment fragment, List<String> permissions, int requestCode) {
302312
Activity activity = fragment.getActivity();
303313
if (activity == null) {
304314
return;
305315
}
306-
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), REQUEST_CODE);
316+
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), requestCode);
307317
}
308318

309319
/* android.support.v4.app.Fragment */
@@ -320,16 +330,21 @@ public static void startPermissionActivity(android.support.v4.app.Fragment fragm
320330
startPermissionActivity(fragment, PermissionUtils.asArrayLists(permissions));
321331
}
322332

333+
public static void startPermissionActivity(android.support.v4.app.Fragment fragment, List<String> permissions) {
334+
startPermissionActivity(fragment, permissions, REQUEST_CODE);
335+
}
336+
323337
/**
324338
* 跳转到应用权限设置页
325339
*
326340
* @param permissions 没有授予或者被拒绝的权限组
341+
* @param requestCode Activity 跳转请求码
327342
*/
328-
public static void startPermissionActivity(android.support.v4.app.Fragment fragment, List<String> permissions) {
343+
public static void startPermissionActivity(android.support.v4.app.Fragment fragment, List<String> permissions, int requestCode) {
329344
Activity activity = fragment.getActivity();
330345
if (activity == null) {
331346
return;
332347
}
333-
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), REQUEST_CODE);
348+
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), requestCode);
334349
}
335350
}

0 commit comments

Comments
 (0)