Skip to content

Commit becbcbc

Browse files
committed
兼容通知栏权限到更低的版本
支持申请查看应用使用情况权限 规避某些机型在权限回调上面出现空指针的问题
1 parent 999f2b2 commit becbcbc

File tree

16 files changed

+175
-82
lines changed

16 files changed

+175
-82
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ build
66
captures
77

88
._*
9-
*.apk
109
*.iml
1110
.DS_Store
1211
local.properties

README.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66

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

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

1111
![](picture/demo_code.png)
1212

1313
* 另外想对 Android 6.0 权限需要深入了解的,可以看这篇文章[Android 6.0 运行权限解析](https://www.jianshu.com/p/6a4dff744031)
1414

15-
![](picture/1.jpg) ![](picture/2.jpg) ![](picture/3.jpg)
16-
![](picture/4.jpg) ![](picture/5.jpg) ![](picture/6.jpg)
15+
![](picture/1.jpg) ![](picture/2.jpg) ![](picture/3.jpg) ![](picture/4.jpg) ![](picture/5.jpg) ![](picture/6.jpg) ![](picture/7.jpg) ![](picture/8.jpg)
1716

1817
#### 集成步骤
1918

@@ -45,7 +44,7 @@ android {
4544
4645
dependencies {
4746
// 权限请求框架:https://github.com/getActivity/XXPermissions
48-
implementation 'com.github.getActivity:XXPermissions:12.8'
47+
implementation 'com.github.getActivity:XXPermissions:13.0'
4948
}
5049
```
5150

@@ -186,13 +185,15 @@ XXPermissions.setInterceptor(new IPermissionInterceptor() {});
186185

187186
| 功能及细节 | [XXPermissions](https://github.com/getActivity/XXPermissions) | [AndPermission](https://github.com/yanzhenjie/AndPermission) | [PermissionX](https://github.com/guolindev/PermissionX) | [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) | [RxPermissions](https://github.com/tbruyelle/RxPermissions) | [PermissionsDispatcher](https://github.com/permissions-dispatcher/PermissionsDispatcher) | [EasyPermissions](https://github.com/googlesamples/easypermissions) |
188187
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
189-
| 对应版本 | 12.8 | 2.0.3 | 1.6.1 | 1.30.6 | 0.12 | 4.9.1 | 3.0.0 |
188+
| 对应版本 | 13.0 | 2.0.3 | 1.6.1 | 1.30.6 | 0.12 | 4.9.1 | 3.0.0 |
190189
| 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/tbruyelle/RxPermissions.svg)](https://github.com/tbruyelle/RxPermissions/issues) | [![](https://img.shields.io/github/issues/permissions-dispatcher/PermissionsDispatcher.svg)](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues) | [![](https://img.shields.io/github/issues/googlesamples/easypermissions.svg)](https://github.com/googlesamples/easypermissions/issues) |
191-
| 框架体积 | 28 KB | 127 KB | 78 KB | 500 KB | 28 KB | 91 KB | 48 KB |
190+
| 框架体积 | 30 KB | 127 KB | 78 KB | 500 KB | 28 KB | 91 KB | 48 KB |
191+
| 所有文件管理权限 ||||||||
192192
| 安装包权限 ||||||||
193193
| 悬浮窗权限 ||||||||
194+
| 系统设置权限 ||||||||
194195
| 通知栏权限 ||||||||
195-
| 系统设置权限 || | | || ||
196+
| 查看应用使用情况权限 || | | || ||
196197
| Android 8.0 权限适配 ||||||||
197198
| Android 9.0 权限适配 ||||||||
198199
| Android 10 权限适配 ||||||||
@@ -261,7 +262,7 @@ XXPermissions.setInterceptor(new IPermissionInterceptor() {});
261262

262263
* 简洁易用:采用链式调用的方式,使用只需一句代码
263264

264-
* 体积感人:功能在同类框架中最全的,但是体积是最小的
265+
* 体积感人:功能在同类框架中是最全的,但是框架体积是垫底的
265266

266267
* 适配极端情况:无论在多么极端恶劣的环境下申请权限,框架依然坚挺
267268

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 31
10-
versionCode 1280
11-
versionName "12.8"
10+
versionCode 1300
11+
versionName "13.0"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
1515
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
1616

17+
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
18+
1719
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
1820

1921
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

app/src/main/java/com/hjq/permissions/demo/MainActivity.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ protected void onCreate(Bundle savedInstanceState) {
3232
findViewById(R.id.btn_main_request_location).setOnClickListener(this);
3333
findViewById(R.id.btn_main_request_bluetooth).setOnClickListener(this);
3434
findViewById(R.id.btn_main_request_storage).setOnClickListener(this);
35-
findViewById(R.id.btn_main_request_package).setOnClickListener(this);
35+
findViewById(R.id.btn_main_request_install).setOnClickListener(this);
3636
findViewById(R.id.btn_main_request_window).setOnClickListener(this);
37-
findViewById(R.id.btn_main_request_notification).setOnClickListener(this);
3837
findViewById(R.id.btn_main_request_setting).setOnClickListener(this);
3938
findViewById(R.id.btn_main_app_details).setOnClickListener(this);
39+
findViewById(R.id.btn_main_request_notification).setOnClickListener(this);
40+
findViewById(R.id.btn_main_request_package).setOnClickListener(this);
4041
}
4142

4243
@Override
@@ -145,7 +146,7 @@ public void onGranted(List<String> permissions, boolean all) {
145146
}
146147
}, delayMillis);
147148

148-
} else if (viewId == R.id.btn_main_request_package) {
149+
} else if (viewId == R.id.btn_main_request_install) {
149150

150151
XXPermissions.with(this)
151152
.permission(Permission.REQUEST_INSTALL_PACKAGES)
@@ -169,6 +170,18 @@ public void onGranted(List<String> permissions, boolean all) {
169170
}
170171
});
171172

173+
} else if (viewId == R.id.btn_main_request_setting) {
174+
175+
XXPermissions.with(this)
176+
.permission(Permission.WRITE_SETTINGS)
177+
.request(new OnPermissionCallback() {
178+
179+
@Override
180+
public void onGranted(List<String> permissions, boolean all) {
181+
toast("获取系统设置权限成功");
182+
}
183+
});
184+
172185
} else if (viewId == R.id.btn_main_request_notification) {
173186

174187
XXPermissions.with(this)
@@ -181,15 +194,15 @@ public void onGranted(List<String> permissions, boolean all) {
181194
}
182195
});
183196

184-
} else if (viewId == R.id.btn_main_request_setting) {
197+
} else if (viewId == R.id.btn_main_request_package) {
185198

186199
XXPermissions.with(this)
187-
.permission(Permission.WRITE_SETTINGS)
200+
.permission(Permission.PACKAGE_USAGE_STATS)
188201
.request(new OnPermissionCallback() {
189202

190203
@Override
191204
public void onGranted(List<String> permissions, boolean all) {
192-
toast("获取系统设置权限成功");
205+
toast("获取读取包权限成功");
193206
}
194207
});
195208

app/src/main/java/com/hjq/permissions/demo/PermissionInterceptor.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,22 +232,29 @@ protected String getPermissionHint(Context context, List<String> permissions) {
232232
}
233233
break;
234234
}
235-
case Permission.NOTIFICATION_SERVICE: {
236-
String hint = context.getString(R.string.common_permission_notification);
235+
case Permission.SYSTEM_ALERT_WINDOW: {
236+
String hint = context.getString(R.string.common_permission_window);
237237
if (!hints.contains(hint)) {
238238
hints.add(hint);
239239
}
240240
break;
241241
}
242-
case Permission.SYSTEM_ALERT_WINDOW: {
243-
String hint = context.getString(R.string.common_permission_window);
242+
case Permission.WRITE_SETTINGS: {
243+
String hint = context.getString(R.string.common_permission_setting);
244244
if (!hints.contains(hint)) {
245245
hints.add(hint);
246246
}
247247
break;
248248
}
249-
case Permission.WRITE_SETTINGS: {
250-
String hint = context.getString(R.string.common_permission_setting);
249+
case Permission.NOTIFICATION_SERVICE: {
250+
String hint = context.getString(R.string.common_permission_notification);
251+
if (!hints.contains(hint)) {
252+
hints.add(hint);
253+
}
254+
break;
255+
}
256+
case Permission.PACKAGE_USAGE_STATS: {
257+
String hint = context.getString(R.string.common_permission_task);
251258
if (!hints.contains(hint)) {
252259
hints.add(hint);
253260
}

app/src/main/res/layout/activity_main.xml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
android:text="申请新版存储权限" />
5858

5959
<Button
60-
android:id="@+id/btn_main_request_package"
60+
android:id="@+id/btn_main_request_install"
6161
android:layout_width="match_parent"
6262
android:layout_height="wrap_content"
6363
android:layout_gravity="center"
@@ -72,6 +72,14 @@
7272
android:layout_marginTop="5dp"
7373
android:text="申请悬浮窗权限" />
7474

75+
<Button
76+
android:id="@+id/btn_main_request_setting"
77+
android:layout_width="match_parent"
78+
android:layout_height="wrap_content"
79+
android:layout_gravity="center"
80+
android:layout_marginTop="5dp"
81+
android:text="申请系统设置权限" />
82+
7583
<Button
7684
android:id="@+id/btn_main_request_notification"
7785
android:layout_width="match_parent"
@@ -81,12 +89,12 @@
8189
android:text="申请通知栏权限" />
8290

8391
<Button
84-
android:id="@+id/btn_main_request_setting"
92+
android:id="@+id/btn_main_request_package"
8593
android:layout_width="match_parent"
8694
android:layout_height="wrap_content"
8795
android:layout_gravity="center"
8896
android:layout_marginTop="5dp"
89-
android:text="申请系统设置权限" />
97+
android:text="申请读取包权限" />
9098

9199
<Button
92100
android:id="@+id/btn_main_app_details"

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
<string name="common_permission_storage">存储权限</string>
2929

3030
<string name="common_permission_install">安装应用权限</string>
31-
<string name="common_permission_notification">通知栏权限</string>
3231
<string name="common_permission_window">悬浮窗权限</string>
3332
<string name="common_permission_setting">系统设置权限</string>
33+
<string name="common_permission_notification">通知栏权限</string>
34+
<string name="common_permission_task">查看使用情况权限</string>
3435
</resources>

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 1280
9-
versionName "12.8"
8+
versionCode 1300
9+
versionName "13.0"
1010
}
1111

1212
// 使用 JDK 1.8

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ private Permission() {}
3333
*/
3434
public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
3535

36-
/** 通知栏权限(特殊权限,注意此权限不需要在清单文件中注册也能申请) */
37-
public static final String NOTIFICATION_SERVICE = "android.permission.NOTIFICATION_SERVICE";
38-
3936
/**
4037
* 悬浮窗权限(特殊权限)
4138
*
@@ -47,6 +44,12 @@ private Permission() {}
4744
/** 系统设置权限(特殊权限) */
4845
public static final String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
4946

47+
/** 通知栏权限(特殊权限,注意此权限不需要在清单文件中注册也能申请) */
48+
public static final String NOTIFICATION_SERVICE = "android.permission.NOTIFICATION_SERVICE";
49+
50+
/** 查看应用使用情况权限,简称读取包权限(特殊权限,Android 5.0 之后才有的权限) */
51+
public static final String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
52+
5053
/** 读取外部存储 */
5154
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
5255
/** 写入外部存储 */

0 commit comments

Comments
 (0)