Skip to content

Commit f354124

Browse files
committed
新增支持申请安卓 9.0 危险权限
1 parent 8caee34 commit f354124

File tree

10 files changed

+89
-56
lines changed

10 files changed

+89
-56
lines changed

README.md

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
```groovy
1717
dependencies {
1818
// 权限请求框架:https://github.com/getActivity/XXPermissions
19-
implementation 'com.hjq:xxpermissions:9.5'
19+
implementation 'com.hjq:xxpermissions:9.6'
2020
}
2121
```
2222

@@ -39,7 +39,7 @@ XXPermissions.with(this)
3939
.request(new OnPermissionCallback() {
4040

4141
@Override
42-
public void onGranted(List<String> granted, boolean all) {
42+
public void onGranted(List<String> permissions, boolean all) {
4343
if (all) {
4444
toast("获取录音和日历权限成功");
4545
} else {
@@ -48,11 +48,11 @@ XXPermissions.with(this)
4848
}
4949

5050
@Override
51-
public void onDenied(List<String> denied, boolean never) {
51+
public void onDenied(List<String> permissions, boolean never) {
5252
if (never) {
5353
toast("被永久拒绝授权,请手动授予录音和日历权限");
5454
// 如果是被永久拒绝就跳转到应用权限系统设置页面
55-
XXPermissions.startPermissionActivity(MainActivity.this, denied);
55+
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
5656
} else {
5757
toast("获取录音和日历权限失败");
5858
}
@@ -130,26 +130,26 @@ android
130130
* 最后直接调用下面这句代码
131131

132132
```java
133-
XXPermissions.with(MainActivity.this)
133+
XXPermissions.with(this)
134134
// 不适配 Android 11 可以这样写
135135
//.permission(Permission.Group.STORAGE)
136136
// 适配 Android 11 需要这样写,这里无需再写 Permission.Group.STORAGE
137137
.permission(Permission.MANAGE_EXTERNAL_STORAGE)
138138
.request(new OnPermissionCallback() {
139139

140140
@Override
141-
public void onGranted(List<String> granted, boolean all) {
141+
public void onGranted(List<String> permissions, boolean all) {
142142
if (all) {
143143
toast("获取存储权限成功");
144144
}
145145
}
146146

147147
@Override
148-
public void onDenied(List<String> denied, boolean never) {
148+
public void onDenied(List<String> permissions, boolean never) {
149149
if (never) {
150150
toast("被永久拒绝授权,请手动授予存储权限");
151151
// 如果是被永久拒绝就跳转到应用权限系统设置页面
152-
XXPermissions.startPermissionActivity(MainActivity.this, denied);
152+
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
153153
} else {
154154
toast("获取存储权限失败");
155155
}
@@ -161,24 +161,27 @@ XXPermissions.with(MainActivity.this)
161161

162162
#### 不同权限请求框架之间的对比
163163

164-
| 功能及细节对比 | [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)
164+
| 功能及细节 | [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)
165165
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
166-
| 对应版本 | 9.0 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 |
166+
| 对应版本 | 9.6 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 |
167167
| minSdk 要求 | API 11+ | API 14+ | API 14+ | API 14+ | API 14+ | API 15+ |
168168
| class 文件数量 | 7 个 | 110 个 | 3 个 | 37 个 | 15 个 | 16 个 |
169-
| aar 包大小 | [21 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) |
170-
| 安装包权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
171-
| 悬浮窗权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
172-
| 通知栏权限 | 支持 | 出现崩溃 | 不支持 | 不支持 | 不支持 | 不支持 |
173-
| 系统设置权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
174-
| Android 8.0 两个新危险权限 | 已适配 | 已适配 | 未适配 | 已适配 | 未适配 | 已适配 |
175-
| Android 10.0 三个新危险权限 | 已适配 | 部分适配 | 未适配 | 已适配 | 未适配 | 已适配 |
176-
| Android 11 新版存储权限 | 已适配 | 未适配 | 未适配 | 未适配 | 未适配 | 未适配 |
177-
| Android 11 新版定位策略 | 已适配 | 未适配 | 未适配 | 未适配 | 未适配 | 未适配 |
169+
| 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) |
170+
| 安装包权限 |||||||
171+
| 悬浮窗权限 |||||||
172+
| 通知栏权限 |||||||
173+
| 系统设置权限 |||||||
174+
| Android 8.0 权限适配 |||||||
175+
| Android 9.0 权限适配 |||||||
176+
| Android 10.0 权限适配 |||||||
177+
| Android 11 新版存储权限 |||||||
178+
| Android 11 新版定位策略 |||||||
178179

179180
#### 框架亮点
180181

181-
* 首款适配 Android 11 的权限请求框架,适配过程几乎零成本
182+
* 首款也是唯一一款适配 Android 11 的权限请求框架
183+
184+
* 首款也是唯一一款适配所有安卓版本的权限请求框架
182185

183186
* 简洁易用,采用链式调用的方式,使用只需一句代码
184187

@@ -190,7 +193,7 @@ XXPermissions.with(MainActivity.this)
190193

191194
* 向下兼容属性,新权限在旧系统可以正常申请,无需调用者适配
192195

193-
* 本框架不依赖任何第三方库,整个框架大小只有 21 kb(是同类框架中体积最小的)
196+
* 本框架不依赖任何第三方库,整个框架大小只有 19 kb(是同类框架中体积最小的)
194197

195198
* 如果申请的权限没有在清单文件中注册会抛出异常(仅在 Debug 模式下判断)
196199

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 14
99
targetSdkVersion 30
10-
versionCode 95
11-
versionName "9.5"
10+
versionCode 96
11+
versionName "9.6"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414
buildTypes {

build.gradle

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

33
buildscript {
44
repositories {
5-
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
65
maven { url 'https://jitpack.io' }
76
jcenter()
87
google()
98
}
109
dependencies {
11-
classpath 'com.android.tools.build:gradle:3.1.3'
12-
classpath 'com.novoda:bintray-release:0.8.0'
10+
classpath 'com.android.tools.build:gradle:3.4.0'
11+
classpath 'com.novoda:bintray-release:0.9.2'
1312
}
1413
}
1514

1615
allprojects {
1716
repositories {
18-
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
19-
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
20-
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
21-
maven { url 'https://maven.aliyun.com/nexus/content/repositories/central/' }
2217
maven { url 'https://dl.bintray.com/getactivity/maven/' }
2318
maven { url 'https://dl.bintray.com/umsdk/release' }
2419
maven { url 'https://maven.google.com' }

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

library/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ android {
88
minSdkVersion 11
99
// noinspection ExpiredTargetSdkVersion
1010
targetSdkVersion 23
11-
versionCode 95
12-
versionName "9.5"
11+
versionCode 96
12+
versionName "9.6"
1313
}
1414

1515
lintOptions {
@@ -26,8 +26,8 @@ publish {
2626
userOrg = 'getactivity'
2727
groupId = 'com.hjq'
2828
artifactId = 'xxpermissions'
29-
version = '9.5'
30-
description = 'Android 6.0 permissions adaptation framework'
29+
publishVersion = '9.6'
30+
desc = 'Android 6.0 permissions adaptation framework'
3131
website = "https://github.com/getActivity/XXPermissions"
3232
}
3333

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ private Permission() {}
112112
/** 接收彩信 */
113113
public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
114114

115-
///** 允许呼叫应用继续在另一个应用中启动的呼叫(需要 Android 9.0 及以上,极其少见,所以不做适配) */
116-
//public static final String ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER";
115+
/** 允许呼叫应用继续在另一个应用中启动的呼叫(需要 Android 9.0 及以上) */
116+
public static final String ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER";
117117

118118
/**
119119
* 权限组

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,14 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in
283283
}
284284
}
285285

286+
if (!PermissionUtils.isAndroid9()) {
287+
// 重新检查 Android 9.0 的一个新权限
288+
if (Permission.ACCEPT_HANDOVER.equals(permission)) {
289+
// 如果当前版本不符合最低要求,那么就重新进行权限检测
290+
grantResults[i] = PermissionUtils.getPermissionStatus(getActivity(), permission);
291+
}
292+
}
293+
286294
if (!PermissionUtils.isAndroid8()) {
287295
// 重新检查 Android 8.0 的两个新权限
288296
if (Permission.ANSWER_PHONE_CALLS.equals(permission) ||

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,12 @@ static Intent getWindowPermissionIntent(Context context) {
103103
Intent intent = null;
104104
if (PermissionUtils.isAndroid6()) {
105105
intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
106-
intent.setData(Uri.parse("package:" + context.getPackageName()));
106+
// 在 Android 11 上面不能加包名跳转,因为就算加了也没有效果
107+
// 还有人反馈在 Android 11 的 TV 模拟器上会出现崩溃的情况
108+
// https://developer.android.google.cn/reference/android/provider/Settings#ACTION_MANAGE_OVERLAY_PERMISSION
109+
if (!PermissionUtils.isAndroid11()) {
110+
intent.setData(Uri.parse("package:" + context.getPackageName()));
111+
}
107112
}
108113

109114
if (intent == null || !PermissionUtils.areActivityIntent(context, intent)) {

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ static boolean isAndroid10() {
4242
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
4343
}
4444

45+
/**
46+
* 是否是 Android 9.0 及以上版本
47+
*/
48+
static boolean isAndroid9() {
49+
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
50+
}
51+
4552
/**
4653
* 是否是 Android 8.0 及以上版本
4754
*/
@@ -226,7 +233,7 @@ static boolean isGrantedPermission(Context context, String permission) {
226233
}
227234

228235
if (!isAndroid10()) {
229-
// 检测 10.0 的三个新权限,如果当前版本不符合最低要求,那么就用旧权限进行检测
236+
// 检测 10.0 的三个新权限
230237
if (Permission.ACCESS_BACKGROUND_LOCATION.equals(permission) ||
231238
Permission.ACCESS_MEDIA_LOCATION.equals(permission)) {
232239
return true;
@@ -237,8 +244,15 @@ static boolean isGrantedPermission(Context context, String permission) {
237244
}
238245
}
239246

247+
if (!isAndroid9()) {
248+
// 检测 9.0 的一个新权限
249+
if (Permission.ACCEPT_HANDOVER.equals(permission)) {
250+
return true;
251+
}
252+
}
253+
240254
if (!isAndroid8()) {
241-
// 检测 8.0 的两个新权限,如果当前版本不符合最低要求,那么就用旧权限进行检测
255+
// 检测 8.0 的两个新权限
242256
if (Permission.ANSWER_PHONE_CALLS.equals(permission)) {
243257
return context.checkSelfPermission(Permission.PROCESS_OUTGOING_CALLS) == PackageManager.PERMISSION_GRANTED;
244258
}
@@ -294,7 +308,7 @@ private static boolean isPermissionPermanentDenied(Activity activity, String per
294308
}
295309

296310
if (!isAndroid10()) {
297-
// 检测 10.0 的三个新权限,如果当前版本不符合最低要求,那么就用旧权限进行检测
311+
// 检测 10.0 的三个新权限
298312
if (Permission.ACCESS_BACKGROUND_LOCATION.equals(permission) ||
299313
Permission.ACCESS_MEDIA_LOCATION.equals(permission)) {
300314
return false;
@@ -306,6 +320,13 @@ private static boolean isPermissionPermanentDenied(Activity activity, String per
306320
}
307321
}
308322

323+
if (!isAndroid9()) {
324+
// 检测 9.0 的一个新权限
325+
if (Permission.ACCEPT_HANDOVER.equals(permission)) {
326+
return false;
327+
}
328+
}
329+
309330
if (!isAndroid8()) {
310331
// 检测 8.0 的两个新权限,如果当前版本不符合最低要求,那么就用旧权限进行检测
311332
if (Permission.ANSWER_PHONE_CALLS.equals(permission) ) {
@@ -513,6 +534,8 @@ static void checkTargetSdkVersion(Context context, List<String> requestPermissio
513534
if (requestPermissions.contains(Permission.MANAGE_EXTERNAL_STORAGE)) {
514535
// 必须设置 targetSdkVersion >= 30 才能正常检测权限,否则请使用 Permission.Group.STORAGE 来申请存储权限
515536
targetSdkMinVersion = Build.VERSION_CODES.R;
537+
} else if (requestPermissions.contains(Permission.ACCEPT_HANDOVER)) {
538+
targetSdkMinVersion = Build.VERSION_CODES.P;
516539
} else if (requestPermissions.contains(Permission.ACCESS_BACKGROUND_LOCATION) ||
517540
requestPermissions.contains(Permission.ACTIVITY_RECOGNITION) ||
518541
requestPermissions.contains(Permission.ACCESS_MEDIA_LOCATION)) {

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public static void setDebugMode(boolean debug) {
4848
sDebugMode = debug;
4949
}
5050

51-
5251
/** Activity 对象 */
5352
private FragmentActivity mActivity;
5453

@@ -199,40 +198,40 @@ public static void startApplicationDetails(Fragment fragment) {
199198
/**
200199
* 跳转到应用权限设置页
201200
*
202-
* @param deniedPermissions 没有授予或者被拒绝的权限组
201+
* @param permissions 没有授予或者被拒绝的权限组
203202
*/
204-
public static void startPermissionActivity(Context context, String... deniedPermissions) {
205-
startPermissionActivity(context, PermissionUtils.asArrayList(deniedPermissions));
203+
public static void startPermissionActivity(Context context, String... permissions) {
204+
startPermissionActivity(context, PermissionUtils.asArrayList(permissions));
206205
}
207206

208-
public static void startPermissionActivity(Context context, List<String> deniedPermissions) {
207+
public static void startPermissionActivity(Context context, List<String> permissions) {
209208
Activity activity = PermissionUtils.getFragmentActivity(context);
210209
if (activity != null) {
211-
startPermissionActivity(activity, deniedPermissions);
210+
startPermissionActivity(activity, permissions);
212211
return;
213212
}
214-
Intent intent = PermissionSettingPage.getSmartPermissionIntent(context, deniedPermissions);
213+
Intent intent = PermissionSettingPage.getSmartPermissionIntent(context, permissions);
215214
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
216215
context.startActivity(intent);
217216
}
218217

219-
public static void startPermissionActivity(Activity activity, String... deniedPermission) {
220-
startPermissionActivity(activity, PermissionUtils.asArrayList(deniedPermission));
218+
public static void startPermissionActivity(Activity activity, String... permissions) {
219+
startPermissionActivity(activity, PermissionUtils.asArrayList(permissions));
221220
}
222221

223-
public static void startPermissionActivity(Activity activity, List<String> deniedPermissions) {
224-
activity.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, deniedPermissions), REQUEST_CODE);
222+
public static void startPermissionActivity(Activity activity, List<String> permissions) {
223+
activity.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), REQUEST_CODE);
225224
}
226225

227-
public static void startPermissionActivity(Fragment fragment, String... deniedPermission) {
228-
startPermissionActivity(fragment, PermissionUtils.asArrayList(deniedPermission));
226+
public static void startPermissionActivity(Fragment fragment, String... permissions) {
227+
startPermissionActivity(fragment, PermissionUtils.asArrayList(permissions));
229228
}
230229

231-
public static void startPermissionActivity(Fragment fragment, List<String> deniedPermissions) {
230+
public static void startPermissionActivity(Fragment fragment, List<String> permissions) {
232231
FragmentActivity activity = fragment.getActivity();
233232
if (activity == null) {
234233
return;
235234
}
236-
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, deniedPermissions), REQUEST_CODE);
235+
fragment.startActivityForResult(PermissionSettingPage.getSmartPermissionIntent(activity, permissions), REQUEST_CODE);
237236
}
238237
}

0 commit comments

Comments
 (0)