Skip to content

Commit 984c72d

Browse files
committed
从 jcenter 仓库迁移到 jitpack 仓库
修复在 debug 模式下开启混淆导致检测机制出现 bug 删除 Permission.Group.LOCATION 权限常量
1 parent 1d0c507 commit 984c72d

File tree

11 files changed

+65
-61
lines changed

11 files changed

+65
-61
lines changed

HelpDoc.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
* 但是需要注意的是:申请过程分为两个步骤,第一步是申请前台定位权限,第二步是申请后台定位权限,用户必须要先同意前台定位权限才能进入后台定位权限的申请。同意前台定位权限的方式有两种:勾选 `仅在使用该应用时允许``仅限这一次`,而到了后台定位权限申请中,用户必须要勾选 `始终允许`,只有这样后台定位权限才能申请通过。
2828

29-
* 还有如果你的应用只需要在前台使用定位功能, 而不需要在后台中使用定位功能,那么请不要申请 `Permission.ACCESS_BACKGROUND_LOCATION` 权限,另外需要注意的是 `Permission.Group.LOCATION` 本身就是包含了后台定位权限的
29+
* 还有如果你的应用只需要在前台使用定位功能, 而不需要在后台中使用定位功能,那么请不要连带申请 `Permission.ACCESS_BACKGROUND_LOCATION` 权限。
3030

3131
![](picture/location_1.jpg)
3232

@@ -117,7 +117,7 @@ XXPermissions.with(this)
117117
* 在 Application 初始化的时候配置
118118

119119
```java
120-
public class MyApplication extends Application {
120+
public class XxxApplication extends Application {
121121

122122
@Override
123123
public void onCreate() {

README.md

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@
1515

1616
#### 集成步骤
1717

18+
* 在项目根目录下的 `build.gradle` 文件中加入
19+
20+
```groovy
21+
buildscript {
22+
......
23+
}
24+
allprojects {
25+
repositories {
26+
// JitPack 远程仓库:https://jitpack.io
27+
maven { url 'https://jitpack.io' }
28+
}
29+
}
30+
```
31+
32+
* 在项目 app 模块下的 `build.gradle` 文件中加入
33+
1834
```groovy
1935
android {
2036
// 支持 JDK 1.8
@@ -26,7 +42,7 @@ android {
2642
2743
dependencies {
2844
// 权限请求框架:https://github.com/getActivity/XXPermissions
29-
implementation 'com.hjq:xxpermissions:10.6'
45+
implementation 'com.github.getActivity:XXPermissions:10.8'
3046
}
3147
```
3248

@@ -134,7 +150,7 @@ public class XxxActivity extends AppCompatActivity {
134150

135151
| 功能及细节 | [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) |
136152
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
137-
| 对应版本 | 10.6 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
153+
| 对应版本 | 10.8 | 2.0.3 | 0.12 | 4.8.0 | 3.0.0 | 1.4.0 | 1.30.5 |
138154
| 框架体积 | [24 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) |
139155
| 安装包权限 ||||||||
140156
| 悬浮窗权限 ||||||||
@@ -161,19 +177,19 @@ public class XxxActivity extends AppCompatActivity {
161177

162178
* 在框架的日常维护中,有很多人跟我反馈过框架有 Bug,但是经过排查和定位发现,这其中有 95% 的问题来自于调用者一些不规范操作导致的,这不仅对我造成很大的困扰,同时也极大浪费了很多小伙伴的时间和精力,于是我在框架中加入了很多审查元素,在 **Debug** 模式下,一旦有某些操作不符合规范,那么框架会直接抛出异常给调用者,并在异常信息中正确指引调用者纠正错误,例如:
163179

164-
1. 传入的 Activity 对象不是 FragmentActivity 的子类,框架会抛出异常,又或者传入的 Activity 对象状态有异常(已经 **Finishing** 或者 **Destroyed**),框架也会抛出异常,请在合适的时机申请权限,如果申请的时机无法预估,请在外层做好判断
180+
1. 传入的 Activity 对象不是 FragmentActivity 的子类,框架会抛出异常,又或者传入的 Activity 的状态异常(已经 **Finishing** 或者 **Destroyed**),这种情况一般是在异步申请权限导致的,框架也会抛出异常,请在合适的时机申请权限,如果申请的时机无法预估,请在外层做好 Activity 状态判断再进行权限申请
165181

166182
2. 如果调用者没有传入任何权限就申请权限的话,框架会抛出异常,如果调用者传入的权限不是危险权限或者特殊权限,框架也会抛出异常,因为有的人会把普通权限当做危险权限传给框架,系统会直接拒绝。
167183

168184
3. 如果在没有适配分区存储的情况下申请外部存储权限,必须在清单文件中注册 `android:requestLegacyExternalStorage="true"`,否则框架会抛出异常,如果不加会导致获取到存储权限,但是无法在 Android 10 的设备上面正常读写外部存储上的文件。
169185

170186
4. 如果申请的权限中包含后台定位权限, 那么这里面则不能包含和定位无关的权限,否则框架会抛出异常,因为 `ACCESS_BACKGROUND_LOCATION` 和其他非定位权限定位掺和在一起申请,在 Android 11 上会出现不申请直接被拒绝的情况。
171187

172-
5. 如果申请的权限和项目中的 **targetSdkVersion** 对不上,框架会抛出异常,是因为 **targetSdkVersion** 代表着项目适配到哪个 Android 版本,系统会自动做向下兼容,假设申请的权限是 Android 11 才出现的,但是 **targetSdkVersion** 还停留在 29,那么在某些机型上的申请结果会出现异常的情况
188+
5. 如果申请的权限和项目中的 **targetSdkVersion** 对不上,框架会抛出异常,是因为 **targetSdkVersion** 代表着项目适配到哪个 Android 版本,系统会自动做向下兼容,假设申请的权限是 Android 11 才出现的,但是 **targetSdkVersion** 还停留在 29,那么在某些机型上的申请结果会出现授权结果异常的情况
173189

174-
6. 如果动态申请的权限没有进行静态注册,那么框架会抛出异常,因为如果不这么做,是可以进行申请权限,但是不会出现授权弹窗,直接被系统拒绝,并且系统不会给出任何提示,并且这个问题在每个机型上面都是**必现的**
190+
6. 如果动态申请的权限没有进行在清单文件中注册,那么框架会抛出异常,因为如果不这么做,是可以进行申请权限,但是不会出现授权弹窗,直接被系统拒绝,并且系统不会给出任何弹窗和提示,并且这个问题在每个机型上面都是**必现的**
175191

176-
* 出现这些问题的原因是,我们对这些机制不太熟悉,而如果框架不加以限制,那么引发各种奇奇怪怪的问题出现,作为框架的作者,表示不仅你们很痛苦,作为框架作者表示也很受伤。因为这些问题不是框架导致的,而是调用者的某些操作不规范导致的。我觉得这个问题最好的解决方式是,由框架做统一的检查,因为我是框架的作者,对权限这块知识点有**较强的专业能力和足够的经验**,知道什么该做,什么不该做,这样就可以对这些骚操作进行一一拦截。
192+
* 出现这些问题的原因是,我们对这些机制不太熟悉,而如果框架不加以限制,那么引发各种奇奇怪怪的问题出现,作为框架的作者,表示不仅你们很痛苦,作为框架作者表示也很受伤。因为这些问题不是框架导致的,而是调用者的某些操作不规范导致的。我觉得这个问题最好的解决方式是,由框架做统一的检查,因为我是框架的作者,对权限申请这块知识点有**较强的专业能力和足够的经验**,知道什么该做,什么不该做,这样就可以对这些骚操作进行一一拦截。
177193

178194
* 当权限申请出现问题时,你希不希望能有个人过来提醒你,告诉你哪里错了?该怎么去纠正?然而这些 XXPermissions 都做到了,在所有的权限请求框架中,我算是第一个做这件事的人,我认为**做好一个框架**不仅仅是要把功能做好,把复杂的场景处理好,更重要的是要**以人为本**,因为框架本身就是为人服务的,要做的不仅仅是解决大家的需求,还要帮助大家在这个过程中少走弯路。
179195

XXPermissions.apk

113 KB
Binary file not shown.

app/build.gradle

Lines changed: 13 additions & 8 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 1060
11-
versionName "10.6"
10+
versionCode 1080
11+
versionName "10.8"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

@@ -19,10 +19,15 @@ android {
1919
}
2020

2121
buildTypes {
22-
release {
22+
debug {
2323
minifyEnabled false
2424
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2525
}
26+
27+
release {
28+
minifyEnabled true
29+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
30+
}
2631
}
2732
}
2833

@@ -37,9 +42,9 @@ dependencies {
3742
// noinspection GradleCompatible
3843
implementation 'com.android.support:appcompat-v7:28.0.0'
3944

40-
// 吐司工具类:https://github.com/getActivity/ToastUtils
41-
implementation 'com.hjq:toast:8.8'
42-
// 内存泄漏捕捉:https://github.com/square/leakcanary
43-
// noinspection GradleDependency
44-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
45+
// 吐司框架:https://github.com/getActivity/ToastUtils
46+
implementation 'com.github.getActivity:ToastUtils:9.0'
47+
48+
// 内存泄漏检测:https://github.com/square/leakcanary
49+
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
4550
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import com.hjq.permissions.XXPermissions;
66
import com.hjq.toast.ToastUtils;
7-
import com.hjq.toast.style.ToastWhiteStyle;
7+
import com.hjq.toast.style.WhiteToastStyle;
88

99
/**
1010
* author : Android 轮子哥
@@ -19,7 +19,7 @@ public void onCreate() {
1919
super.onCreate();
2020

2121
// 初始化吐司工具类
22-
ToastUtils.init(this, new ToastWhiteStyle(getApplicationContext()));
22+
ToastUtils.init(this, new WhiteToastStyle());
2323

2424
// 设置权限申请拦截器
2525
XXPermissions.setInterceptor(new PermissionInterceptor());

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ public void onGranted(List<String> permissions, boolean all) {
7373
} else if (viewId == R.id.btn_main_request_3) {
7474

7575
XXPermissions.with(this)
76-
.permission(Permission.Group.LOCATION)
76+
.permission(Permission.ACCESS_COARSE_LOCATION)
77+
.permission(Permission.ACCESS_FINE_LOCATION)
78+
.permission(Permission.ACCESS_BACKGROUND_LOCATION)
7779
.request(new OnPermissionCallback() {
7880

7981
@Override

build.gradle

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ buildscript {
88
}
99
dependencies {
1010
classpath 'com.android.tools.build:gradle:3.4.0'
11-
classpath 'com.novoda:bintray-release:0.9.2'
1211
}
1312
}
1413

1514
allprojects {
1615
repositories {
17-
maven { url 'https://dl.bintray.com/getactivity/maven/' }
18-
maven { url 'https://dl.bintray.com/umsdk/release' }
19-
maven { url 'https://maven.google.com' }
2016
maven { url 'https://jitpack.io' }
2117
jcenter()
2218
google()

library/build.gradle

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
apply plugin: 'com.android.library'
2-
apply plugin: 'com.novoda.bintray-release'
32

43
android {
54
compileSdkVersion 30
65

76
defaultConfig {
87
minSdkVersion 11
9-
versionCode 1060
10-
versionName "10.6"
8+
versionCode 1080
9+
versionName "10.8"
1110
}
1211

1312
// 使用 JDK 1.8
@@ -26,15 +25,6 @@ dependencies {
2625
implementation 'com.android.support:support-fragment:24.2.0'
2726
}
2827

29-
publish {
30-
userOrg = 'getactivity'
31-
groupId = 'com.hjq'
32-
artifactId = 'xxpermissions'
33-
publishVersion = '10.6'
34-
desc = 'Android 6.0 permissions adaptation framework'
35-
website = "https://github.com/getActivity/XXPermissions"
36-
}
37-
3828
tasks.withType(Javadoc) {
3929
options.addStringOption('Xdoclint:none', '-quiet')
4030
options.addStringOption('encoding', 'UTF-8')

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

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,14 @@ private Permission() {}
3535

3636
/** 读取外部存储 */
3737
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
38-
3938
/** 写入外部存储 */
4039
public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
4140

42-
/** 读取日历 */
43-
public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
44-
/** 修改日历 */
45-
public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
46-
4741
/** 相机权限 */
4842
public static final String CAMERA = "android.permission.CAMERA";
4943

50-
/** 读取联系人 */
51-
public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
52-
/** 修改联系人 */
53-
public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
54-
/** 访问账户列表 */
55-
public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
44+
/** 录音权限 */
45+
public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
5646

5747
/** 获取精确位置 */
5848
public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
@@ -61,12 +51,21 @@ private Permission() {}
6151
/** 在后台获取位置(需要 Android 10.0 及以上) */
6252
public static final String ACCESS_BACKGROUND_LOCATION = "android.permission.ACCESS_BACKGROUND_LOCATION";
6353

54+
/** 读取联系人 */
55+
public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
56+
/** 修改联系人 */
57+
public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
58+
/** 访问账户列表 */
59+
public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
60+
61+
/** 读取日历 */
62+
public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
63+
/** 修改日历 */
64+
public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
65+
6466
/** 读取照片中的地理位置(需要 Android 10.0 及以上)*/
6567
public static final String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";
6668

67-
/** 录音权限 */
68-
public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
69-
7069
/** 读取电话状态(这个权限在某些手机上面是申请失败的) */
7170
public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
7271
/** 拨打电话 */
@@ -121,12 +120,6 @@ public static final class Group {
121120
Permission.READ_EXTERNAL_STORAGE,
122121
Permission.WRITE_EXTERNAL_STORAGE};
123122

124-
/** 位置权限 */
125-
public static final String[] LOCATION = new String[]{
126-
Permission.ACCESS_FINE_LOCATION,
127-
Permission.ACCESS_COARSE_LOCATION,
128-
Permission.ACCESS_BACKGROUND_LOCATION};
129-
130123
/** 日历权限 */
131124
public static final String[] CALENDAR = new String[]{
132125
Permission.READ_CALENDAR,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ static boolean checkPermissionArgument(List<String> requestPermissions, boolean
7373
if (debugMode) {
7474
List<String> allPermissions = new ArrayList<>();
7575
Field[] fields = Permission.class.getDeclaredFields();
76+
// 在开启代码混淆之后,反射 Permission 类中的字段会得到空的字段数组
77+
// 这个是因为编译后常量会在代码中直接引用,所以 Permission 常量字段在混淆的时候会被移除掉
78+
if (fields.length == 0) {
79+
return true;
80+
}
7681
for (Field field : fields) {
7782
if (!String.class.equals(field.getType())) {
7883
continue;

0 commit comments

Comments
 (0)