Skip to content

Commit

Permalink
从 jcenter 仓库迁移到 jitpack 仓库
Browse files Browse the repository at this point in the history
修复在 debug 模式下开启混淆导致检测机制出现 bug
删除 Permission.Group.LOCATION 权限常量
  • Loading branch information
getActivity committed Apr 21, 2021
1 parent 1d0c507 commit 984c72d
Show file tree
Hide file tree
Showing 11 changed files with 65 additions and 61 deletions.
4 changes: 2 additions & 2 deletions HelpDoc.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

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

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

![](picture/location_1.jpg)

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

```java
public class MyApplication extends Application {
public class XxxApplication extends Application {

@Override
public void onCreate() {
Expand Down
28 changes: 22 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,22 @@

#### 集成步骤

* 在项目根目录下的 `build.gradle` 文件中加入

```groovy
buildscript {
......
}
allprojects {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
}
```

* 在项目 app 模块下的 `build.gradle` 文件中加入

```groovy
android {
// 支持 JDK 1.8
Expand All @@ -26,7 +42,7 @@ android {
dependencies {
// 权限请求框架:https://github.com/getActivity/XXPermissions
implementation 'com.hjq:xxpermissions:10.6'
implementation 'com.github.getActivity:XXPermissions:10.8'
}
```

Expand Down Expand Up @@ -134,7 +150,7 @@ public class XxxActivity extends AppCompatActivity {

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

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

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

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

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

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

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

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

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

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

Expand Down
Binary file modified XXPermissions.apk
Binary file not shown.
21 changes: 13 additions & 8 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ android {
applicationId "com.hjq.permissions.demo"
minSdkVersion 14
targetSdkVersion 30
versionCode 1060
versionName "10.6"
versionCode 1080
versionName "10.8"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

Expand All @@ -19,10 +19,15 @@ android {
}

buildTypes {
release {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

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

// 吐司工具类:https://github.com/getActivity/ToastUtils
implementation 'com.hjq:toast:8.8'
// 内存泄漏捕捉:https://github.com/square/leakcanary
// noinspection GradleDependency
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
// 吐司框架:https://github.com/getActivity/ToastUtils
implementation 'com.github.getActivity:ToastUtils:9.0'

// 内存泄漏检测:https://github.com/square/leakcanary
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import com.hjq.permissions.XXPermissions;
import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.ToastWhiteStyle;
import com.hjq.toast.style.WhiteToastStyle;

/**
* author : Android 轮子哥
Expand All @@ -19,7 +19,7 @@ public void onCreate() {
super.onCreate();

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

// 设置权限申请拦截器
XXPermissions.setInterceptor(new PermissionInterceptor());
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/hjq/permissions/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ public void onGranted(List<String> permissions, boolean all) {
} else if (viewId == R.id.btn_main_request_3) {

XXPermissions.with(this)
.permission(Permission.Group.LOCATION)
.permission(Permission.ACCESS_COARSE_LOCATION)
.permission(Permission.ACCESS_FINE_LOCATION)
.permission(Permission.ACCESS_BACKGROUND_LOCATION)
.request(new OnPermissionCallback() {

@Override
Expand Down
4 changes: 0 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,11 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
classpath 'com.novoda:bintray-release:0.9.2'
}
}

allprojects {
repositories {
maven { url 'https://dl.bintray.com/getactivity/maven/' }
maven { url 'https://dl.bintray.com/umsdk/release' }
maven { url 'https://maven.google.com' }
maven { url 'https://jitpack.io' }
jcenter()
google()
Expand Down
14 changes: 2 additions & 12 deletions library/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'

android {
compileSdkVersion 30

defaultConfig {
minSdkVersion 11
versionCode 1060
versionName "10.6"
versionCode 1080
versionName "10.8"
}

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

publish {
userOrg = 'getactivity'
groupId = 'com.hjq'
artifactId = 'xxpermissions'
publishVersion = '10.6'
desc = 'Android 6.0 permissions adaptation framework'
website = "https://github.com/getActivity/XXPermissions"
}

tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
Expand Down
35 changes: 14 additions & 21 deletions library/src/main/java/com/hjq/permissions/Permission.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,14 @@ private Permission() {}

/** 读取外部存储 */
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";

/** 写入外部存储 */
public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";

/** 读取日历 */
public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
/** 修改日历 */
public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";

/** 相机权限 */
public static final String CAMERA = "android.permission.CAMERA";

/** 读取联系人 */
public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
/** 修改联系人 */
public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
/** 访问账户列表 */
public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
/** 录音权限 */
public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";

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

/** 读取联系人 */
public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
/** 修改联系人 */
public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
/** 访问账户列表 */
public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";

/** 读取日历 */
public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
/** 修改日历 */
public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";

/** 读取照片中的地理位置(需要 Android 10.0 及以上)*/
public static final String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";

/** 录音权限 */
public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";

/** 读取电话状态(这个权限在某些手机上面是申请失败的) */
public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
/** 拨打电话 */
Expand Down Expand Up @@ -121,12 +120,6 @@ public static final class Group {
Permission.READ_EXTERNAL_STORAGE,
Permission.WRITE_EXTERNAL_STORAGE};

/** 位置权限 */
public static final String[] LOCATION = new String[]{
Permission.ACCESS_FINE_LOCATION,
Permission.ACCESS_COARSE_LOCATION,
Permission.ACCESS_BACKGROUND_LOCATION};

/** 日历权限 */
public static final String[] CALENDAR = new String[]{
Permission.READ_CALENDAR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ static boolean checkPermissionArgument(List<String> requestPermissions, boolean
if (debugMode) {
List<String> allPermissions = new ArrayList<>();
Field[] fields = Permission.class.getDeclaredFields();
// 在开启代码混淆之后,反射 Permission 类中的字段会得到空的字段数组
// 这个是因为编译后常量会在代码中直接引用,所以 Permission 常量字段在混淆的时候会被移除掉
if (fields.length == 0) {
return true;
}
for (Field field : fields) {
if (!String.class.equals(field.getType())) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,9 @@ static Intent getWindowPermissionIntent(Context context) {
Intent intent = null;
if (PermissionUtils.isAndroid6()) {
intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
// 在 Android 11 上面不能加包名跳转,因为就算加了也没有效果
// 还有人反馈在 Android 11 的 TV 模拟器上会出现崩溃的情况
// 在 Android 11 加包名跳转也是没有效果的,官方文档链接:
// https://developer.android.google.cn/reference/android/provider/Settings#ACTION_MANAGE_OVERLAY_PERMISSION
if (!PermissionUtils.isAndroid11()) {
intent.setData(getPackageNameUri(context));
}
intent.setData(getPackageNameUri(context));
}

if (intent == null || !areActivityIntent(context, intent)) {
Expand Down

0 comments on commit 984c72d

Please sign in to comment.