Skip to content

Commit a5ca170

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents c330f26 + fc20a05 commit a5ca170

File tree

1 file changed

+25
-67
lines changed

1 file changed

+25
-67
lines changed

README.md

+25-67
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
# 权限请求框架
22

3-
* 码云地址:[Gitee](https://gitee.com/getActivity/XXPermissions)
4-
5-
* [点击此处下载Demo](XXPermissions.apk)[博文地址:一句代码搞定权限请求,从未如此简单](https://www.jianshu.com/p/c69ff8a445ed)
6-
7-
* 另外想对 Android 6.0 权限需要深入了解的,可以看这篇文章[Android 6.0 运行权限解析](https://www.jianshu.com/p/6a4dff744031)
3+
* [点击此处下载Demo](HPermissions.apk)[博客地址](https://www.jianshu.com/u/37d88b909f3b)
84

95
![](picture/1.jpg) ![](picture/2.jpg) ![](picture/3.jpg)
106
![](picture/4.jpg) ![](picture/5.jpg) ![](picture/6.jpg)
117

12-
#### 集成步骤
13-
8+
####使用方式
9+
引用
10+
1、在根目录的build.gradle中加入如下配置
11+
```
12+
allprojects {
13+
repositories {
14+
...
15+
maven { url 'https://jitpack.io' }
16+
}
17+
}
18+
```
19+
2、在要是用的module中增加如下引用
1420
```groovy
1521
dependencies {
1622
// 权限请求框架
17-
implementation 'com.hjq:xxpermissions:9.2'
23+
implementation 'com.github.dahui888:HPermissions:v1.0'
1824
}
1925
```
2026

@@ -50,7 +56,7 @@ HPermissions.with(this)
5056
if (never) {
5157
toast("被永久拒绝授权,请手动授予录音和日历权限");
5258
// 如果是被永久拒绝就跳转到应用权限系统设置页面
53-
XXPermissions.startPermissionActivity(MainActivity.this, denied);
59+
HPermissions.startPermissionActivity(MainActivity.this, denied);
5460
} else {
5561
toast("获取录音和日历权限失败");
5662
}
@@ -65,9 +71,9 @@ public class XxxActivity extends AppCompatActivity {
6571
@Override
6672
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
6773
super.onActivityResult(requestCode, resultCode, data);
68-
if (requestCode == XXPermissions.REQUEST_CODE) {
69-
if (XXPermissions.hasPermission(this, Permission.RECORD_AUDIO) &&
70-
XXPermissions.hasPermission(this, Permission.Group.CALENDAR)) {
74+
if (requestCode == HPermissions.REQUEST_CODE) {
75+
if (HPermissions.hasPermission(this, Permission.RECORD_AUDIO) &&
76+
HPermissions.hasPermission(this, Permission.Group.CALENDAR)) {
7177
toast("用户已经在权限设置页授予了录音和日历权限");
7278
} else {
7379
toast("用户没有在权限设置页授予权限");
@@ -92,7 +98,7 @@ public class XxxActivity extends AppCompatActivity {
9298

9399
* 在 Android 10 上面,定位被划分为前台权限(精确和模糊)和后台权限,而到了 Android 11 上面,需要分别申请这两种权限,如果同时申请这两种权限会惨遭系统无情拒绝,连权限申请对话框都不会弹,直接被系统拒绝,导致定位权限申请失败。
94100

95-
* 如果你使用的是 XXPermissions 最新版本,那么恭喜你,直接将前台定位权限和后台定位权限全部传给框架即可,框架已经自动帮你把这两种权限分开申请了,整个适配过程零成本。
101+
* 如果你使用的是 HPermissions 最新版本,那么恭喜你,直接将前台定位权限和后台定位权限全部传给框架即可,框架已经自动帮你把这两种权限分开申请了,整个适配过程零成本。
96102

97103
#### Android 11 存储权限适配
98104

@@ -129,7 +135,7 @@ android
129135
* 最后直接调用下面这句代码
130136

131137
```java
132-
XXPermissions.with(MainActivity.this)
138+
HPermissions.with(MainActivity.this)
133139
// 不适配 Android 11 可以这样写
134140
//.permission(Permission.Group.STORAGE)
135141
// 适配 Android 11 需要这样写,这里无需再写 Permission.Group.STORAGE
@@ -148,7 +154,7 @@ XXPermissions.with(MainActivity.this)
148154
if (never) {
149155
toast("被永久拒绝授权,请手动授予存储权限");
150156
// 如果是被永久拒绝就跳转到应用权限系统设置页面
151-
XXPermissions.startPermissionActivity(MainActivity.this, denied);
157+
HPermissions.startPermissionActivity(MainActivity.this, denied);
152158
} else {
153159
toast("获取存储权限失败");
154160
}
@@ -160,12 +166,12 @@ XXPermissions.with(MainActivity.this)
160166

161167
#### 不同权限请求框架之间的对比
162168

163-
| 功能及细节对比 | [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)
169+
| 功能及细节对比 | [HPermissions](https://github.com/dahui888/HPermissions) | [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)
164170
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
165171
| 对应版本 | 9.0 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 |
166172
| minSdk 要求 | API 11+ | API 14+ | API 14+ | API 14+ | API 14+ | API 15+ |
167173
| class 文件数量 | 7 个 | 110 个 | 3 个 | 37 个 | 15 个 | 16 个 |
168-
| aar 包大小 | [19 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) | [22 KB](https://bintray.com/hotchemi/org.permissionsdispatcher/permissionsdispatcher#files/org/permissionsdispatcher/permissionsdispatcher) | [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) |
174+
| aar 包大小 | [19 KB](https://github.com/dahui888/HPermissions) | [127 KB](https://mvnrepository.com/artifact/com.yanzhenjie/permission) | [28 KB](https://jitpack.io/#com.github.tbruyelle/rxpermissions) | [22 KB](https://bintray.com/hotchemi/org.permissionsdispatcher/permissionsdispatcher#files/org/permissionsdispatcher/permissionsdispatcher) | [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) |
169175
| 是否有依赖 | 无任何依赖 | 依赖 Support | 依赖 AndroidX 和 RxJava | 依赖 AndroidX | 依赖 AndroidX | 依赖 AndroidX |
170176
| 安装包权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
171177
| 悬浮窗权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
@@ -200,62 +206,14 @@ XXPermissions.with(MainActivity.this)
200206

201207
* 因为 Android 6.0 以下的权限管理是手机厂商做的,那个时候谷歌还没有统一权限管理的方案,所以就算我们的应用没有适配也不会有任何问题,因为手机厂商对这块有自己的处理,但是有一点是肯定的,就算用户拒绝了授权,也不会导致应用崩溃,只会返回空白的通行证。
202208

203-
* 如果 XXPermissions 做这块的适配也可以做到,通过反射系统服务 AppOpsManager 类中的字段即可,但是并不能保证权限判断的准确性,可能会存在一定的误差,其次是适配的成本太高,因为国内手机厂商太多,对这块的改动参差不齐。
209+
* 如果 HPermissions 做这块的适配也可以做到,通过反射系统服务 AppOpsManager 类中的字段即可,但是并不能保证权限判断的准确性,可能会存在一定的误差,其次是适配的成本太高,因为国内手机厂商太多,对这块的改动参差不齐。
204210

205211
* 考虑到 Android 6.0 以下的设备占比很低,后续也会越来越少,会逐步退出历史的舞台,所以我的决定是不对这块做适配。
206212

207-
#### 新版 XXPermissions 为什么移除了国产手机权限设置页功能?
208-
209-
* XXPermissions 9.0 及之前是有存在这一功能的,但是我在后续的版本上面将这个功能移除了,原因是有很多人跟我反馈这个功能其实存在很大的缺陷,例如在一些华为新机型上面可能跳转的页面不是应用的权限设置页,而是所有应用的权限管理列表界面。
210-
211-
* 其实不止华为有问题,小米同样有问题,有很多人跟我反馈过同一个问题,XXPermissions 跳转到国产手机权限设置页,用户正常授予了权限之后返回仍然检测到权限仍然是拒绝的状态,这个问题反馈的次数很多,但是迟迟不能排查到原因,终于在最后一次得到答案了,[有人](https://github.com/getActivity/XXPermissions/issues/38)帮我排查到是 miui 优化开关的问题(小米手机 ---> 开发者选项 ---> 启用 miui 优化),那么问题来了,这个开关有什么作用?是如何影响到 XXPermissions 的?
212-
213-
* 首先这个问题要从 XXPermissions 跳转到国产手机设置页的原理讲起,从谷歌提供的原生 API 我们最多只能跳转到应用详情页,并不能直接跳转到权限设置页,而需要用户在应用详情页再次点击才能进入权限设置页。如果从用户体验的角度上看待这个问题,肯定是直接跳转到权限设置页是最好的,但是这种方式是不受谷歌支持的,当然也有方法实现,网上都有一个通用的答案,就是直接捕获某个品牌手机的权限设置页 `Activity` 包名然后进行跳转。这种想法的起点是好的,但是存在许多问题,并不能保证每个品牌的所有机型都能适配到位,手机产商更改这个 `Activity` 的包名的次数和频率比较高,在最近发布的一些新的华为机型上面几乎已经全部失效,也就是 `startActivity` 的时候会报 `ActivityNotFoundException` 或 `SecurityException ` 异常,当然这些异常是可以被捕捉到的,但是仅仅只能捕获到崩溃,一些非崩溃的行为我们并不能从中得知和处理,例如我刚刚讲过的华为和小米的问题,这些问题并不能导致崩溃,但是会导致功能出现异常。
214-
215-
* 而 miui 优化开关是小米工程师预留的切换 miui 和原生的功能开关,例如在这个开关开启的时候,在应用详情页点击权限管理会跳转到小米的权限设置页,如果这个开关是关闭状态(默认是开启状态),在应用详情页点击权限管理会跳转到谷歌原生的权限设置页,具体效果如图:
216-
217-
![](picture/miui_1.jpg)
218-
219-
![](picture/miui_2.jpg)
220-
221-
* 最大的问题在于:这两个界面是不同的 Activity,一个是小米定制的权限设置页,第二个是谷歌原生的权限设置页,当 miui 优化开启的时候,在小米定制的权限设置页授予权限才能有效果,当这个 miui 优化关闭的时候,在谷歌原生的权限设置页授予权限才能有效果。而跳转到国产手机页永远只会跳转到小米定制的那个权限设置页,所以就会导致当 miui 优化关闭的时候,使用代码跳转到小米权限设置页授予了权限之后返回仍然显示失败的问题。
222-
223-
* 有人可能会说,解决这个问题的方式很简单,判断 miui 优化开关,如果是开启状态就跳转到小米定制的权限设置页,如果是关闭状态就跳转到谷歌原生的权限设置页,这样不就可以了?其实这个解决方案我也有尝试过,我曾委托联系到在小米工作的 miui 工程师,也有人帮我反馈这个问题给小米那边,最后得到答复都是一致的。
224-
225-
![](picture/miui_3.jpg)
226-
227-
![](picture/miui_4.jpg)
228-
229-
* 这个功能的出发点是好的,但是我们没办法做好它,经过慎重考虑,决定将这个功能在 XXPermissions 9.2 版本上面移除。
230-
231-
#### 作者的其他开源项目
232-
233-
* 安卓技术中台:[AndroidProject](https://github.com/getActivity/AndroidProject)
234-
235-
* 网络框架:[EasyHttp](https://github.com/getActivity/EasyHttp)
236-
237-
* 日志框架:[Logcat](https://github.com/getActivity/Logcat)
238-
239-
* 吐司框架:[ToastUtils](https://github.com/getActivity/ToastUtils)
240-
241-
* 标题栏框架:[TitleBar](https://github.com/getActivity/TitleBar)
242-
243-
* 国际化框架:[MultiLanguages](https://github.com/getActivity/MultiLanguages)
244-
245-
* 悬浮窗框架:[XToast](https://github.com/getActivity/XToast)
246-
247-
#### Android技术讨论Q群:78797078
248-
249-
#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:
250-
251-
![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_ali.png) ![](https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_wechat.png)
252-
253-
#### [点击查看捐赠列表](https://github.com/getActivity/Donate)
254-
255213
## License
256214

257215
```text
258-
Copyright 2018 Huang JinQun
216+
Copyright 2020 Pan Hui
259217
260218
Licensed under the Apache License, Version 2.0 (the "License");
261219
you may not use this file except in compliance with the License.

0 commit comments

Comments
 (0)