Skip to content

Commit

Permalink
优化代码命名规范
Browse files Browse the repository at this point in the history
优化新版存储权限判断逻辑
优化权限设置页面跳转逻辑
新增权限申请调试模式开关
标记不断申请权限功能为过时
移除自动获取清单文件进行申请功能
  • Loading branch information
getActivity committed Sep 2, 2020
1 parent 3bd32c4 commit f6e929b
Show file tree
Hide file tree
Showing 16 changed files with 623 additions and 436 deletions.
51 changes: 29 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,14 @@

```groovy
dependencies {
implementation 'com.hjq:xxpermissions:8.2'
implementation 'com.hjq:xxpermissions:8.6'
}
```

#### 一句代码搞定权限请求,从未如此简单

> [点此查看完整的示例代码](https://github.com/getActivity/XXPermissions/blob/master/app/src/main/java/com/hjq/permissions/demo/MainActivity.java)
```java
XXPermissions.with(this)
// 可设置被拒绝后继续申请,直到用户授权或者永久拒绝
//.constantRequest()
// 申请安装包权限
//.permission(Permission.REQUEST_INSTALL_PACKAGES)
// 申请悬浮窗权限
Expand All @@ -34,9 +30,9 @@ XXPermissions.with(this)
// 申请系统设置权限
//.permission(Permission.WRITE_SETTINGS)
// 申请单个权限
.permission(Permission.CAMERA)
.permission(Permission.RECORD_AUDIO)
// 申请多个权限
.permission(Permission.Group.STORAGE)
.permission(Permission.Group.CALENDAR)
.request(new OnPermission() {

@Override
Expand All @@ -49,8 +45,8 @@ XXPermissions.with(this)
}

@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
public void noPermission(List<String> denied, boolean never) {
if (never) {
ToastUtils.show("被永久拒绝授权,请手动授予存储和拍照权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
Expand All @@ -63,27 +59,31 @@ XXPermissions.with(this)

#### 框架亮点

* 第一款适配 Android 11 存储权限的框架,适配过程几乎零成本

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

* 支持单个权限、多个权限、单个权限组、多个权限组请求

* 不指定权限则自动获取清单文件上的危险权限进行申请
* 支持大部分国产手机直接跳转到具体的权限设置页面

* 支持申请安装包、悬浮窗、通知栏、系统设置权限

* 如果动态申请的权限没有在清单文件中注册会抛出异常
* 支持所有危险权限的申请,包含 6.0 之后出现的新权限

* 支持大部分国产手机直接跳转到具体的权限设置页面
* 向下兼容属性,新权限在旧系统可以正常申请,无需调用者适配

* 可设置被拒绝后继续申请,直到用户授权或者永久拒绝
* 本框架不依赖任何第三方库,整个框架大小不到 20 kb(在同类框架中排名第一)

* 支持请求 6.0 的悬浮窗权限和 8.0 的应用安装权限
* 如果申请的权限没有在清单文件中注册会抛出异常(仅在 Debug 模式下判断)

* 本框架不依赖 Support 库,兼容 Eclipse 和 Studio
* 如果申请的权限和项目 targetSdkVersion 不符合要求会抛出异常(仅在 Debug 模式下判断)

#### Android 11 存储适配

* 如果你的项目需要适配 Android 11 存储权限,那么需要先将 targetSdkVersion 进行升级

```java
```groovy
android
defaultConfig {
targetSdkVersion 30
Expand All @@ -103,6 +103,13 @@ android
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

* 还需要在清单文件中加上这个属性,否则在 Android 10 的设备上将无法正常读写外部存储上的文件

```xml
<application
android:requestLegacyExternalStorage="true">
```

* 最后直接调用下面这句代码

Expand All @@ -122,8 +129,8 @@ XXPermissions.with(MainActivity.this)
}

@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
public void noPermission(List<String> denied, boolean never) {
if (never) {
ToastUtils.show("被永久拒绝授权,请手动授予存储权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
Expand All @@ -148,7 +155,7 @@ XXPermissions.with(MainActivity.this)

| 功能及细节对比 | [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)
| :--------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
| aar 包大小 | [17 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) |
| aar 包大小 | [18 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) |
| minSdk 要求 | API 11+ | API 14+ | API 14+ | API 14+ | API 14+ | API 15+ |
| targetSdk 要求 | API 23+ | API 29+ | API 29+ | API 29+ | API 30+ | API 30+ |
| class 文件数量 | 8 个 | 110 个 | 3 个 | 37 个 | 15 个 | 16 个 |
Expand All @@ -157,10 +164,10 @@ XXPermissions.with(MainActivity.this)
| 悬浮窗权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 通知栏权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 系统设置权限 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| Android 8.0 两个新危险权限 | 已适配 | 已适配 | 未适配 | 已适配 | 未适配 | 已适配 |
| Android 10.0 三个新危险权限 | 已适配 | 部分适配 | 未适配 | 已适配 | 未适配 | 已适配 |
| Android 11 新版存储权限 | 已适配 | 未适配 | 未适配 | 未适配 | 未适配 | 未适配 |
| 国产手机权限设置界面 | 已适配 | 已适配 | 未适配 | 未适配 | 未适配 | 未适配 |
| Android 11 存储权限 | 已适配 | 未适配 | 未适配 | 未适配 | 未适配 | 未适配 |
| 判断权限被永久拒绝 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 不断请求权限直到永久拒绝 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |

#### 作者的其他开源项目

Expand Down
Binary file modified XXPermissions.apk
Binary file not shown.
11 changes: 7 additions & 4 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 82
versionName "8.2"
versionCode 86
versionName "8.6"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand All @@ -20,12 +20,15 @@ android {
}

dependencies {
// 依赖 libs 目录下所有的 jar 和 aar 包
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(include: ['*.aar'], dir: 'libs')

implementation project(':library')

// 谷歌兼容库:https://developer.android.google.cn/jetpack/androidx/releases/appcompat?hl=zh-cn
implementation 'androidx.appcompat:appcompat:1.3.0-alpha01'
implementation 'com.google.android.material:material:1.3.0-alpha01'
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
implementation 'com.google.android.material:material:1.3.0-alpha02'

// 吐司工具类:https://github.com/getActivity/ToastUtils
implementation 'com.hjq:toast:8.6'
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@

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

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

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

<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
android:requestLegacyExternalStorage="true"
android:theme="@style/AppTheme"
tools:ignore="UnusedAttribute,LockedOrientationActivity">

<activity
android:name=".MainActivity"
Expand Down
47 changes: 23 additions & 24 deletions app/src/main/java/com/hjq/permissions/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,59 +46,58 @@ public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_main_request_1:
XXPermissions.with(this)
.permission(Permission.Group.STORAGE, Permission.Group.CALENDAR)
.permission(Permission.CAMERA)
.request(new OnPermission() {

@Override
public void hasPermission(List<String> granted, boolean all) {
if (all) {
ToastUtils.show("获取存储和日历权限成功");
} else {
ToastUtils.show("获取权限成功,部分权限未正常授予");
ToastUtils.show("获取拍照权限成功");
}
}

@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
ToastUtils.show("被永久拒绝授权,请手动授予存储和日历权限");
public void noPermission(List<String> denied, boolean never) {
if (never) {
ToastUtils.show("被永久拒绝授权,请手动授予拍照权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
} else {
ToastUtils.show("获取存储和日历权限失败");
ToastUtils.show("获取拍照权限失败");
}
}
});
break;
case R.id.btn_main_request_2:
XXPermissions.with(this)
// 可设置被拒绝后继续申请,直到用户授权或者永久拒绝
.constantRequest()
.permission(Permission.CAMERA)
.permission(Permission.RECORD_AUDIO)
.permission(Permission.Group.CALENDAR)
.request(new OnPermission() {

@Override
public void hasPermission(List<String> granted, boolean all) {
if (all) {
ToastUtils.show("获取拍照权限成功");
ToastUtils.show("获取录音和日历权限成功");
} else {
ToastUtils.show("获取权限成功,部分权限未正常授予");
}
}

@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
ToastUtils.show("被永久拒绝授权,请手动授予拍照权限");
public void noPermission(List<String> denied, boolean never) {
if (never) {
ToastUtils.show("被永久拒绝授权,请手动授予录音和日历权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
} else {
ToastUtils.show("获取拍照权限失败");
ToastUtils.show("获取录音和日历权限失败");
}
}
});
break;
case R.id.btn_main_request_3:
long delayMillis = 0;
if (Build.VERSION.SDK_INT < 30) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
delayMillis = 2000;
ToastUtils.show("当前版本不是 Android 11 以上,会自动变更为旧版的请求方式");
}
Expand All @@ -122,8 +121,8 @@ public void hasPermission(List<String> granted, boolean all) {
}

@Override
public void noPermission(List<String> denied, boolean quick) {
if (quick) {
public void noPermission(List<String> denied, boolean never) {
if (never) {
ToastUtils.show("被永久拒绝授权,请手动授予存储权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(MainActivity.this, denied);
Expand All @@ -146,7 +145,7 @@ public void hasPermission(List<String> granted, boolean all) {
}

@Override
public void noPermission(List<String> denied, boolean quick) {
public void noPermission(List<String> denied, boolean never) {
ToastUtils.show("获取安装包权限失败,请手动授予权限");
}
});
Expand All @@ -162,7 +161,7 @@ public void hasPermission(List<String> granted, boolean all) {
}

@Override
public void noPermission(List<String> denied, boolean quick) {
public void noPermission(List<String> denied, boolean never) {
ToastUtils.show("获取悬浮窗权限失败,请手动授予权限");
}
});
Expand All @@ -178,7 +177,7 @@ public void hasPermission(List<String> granted, boolean all) {
}

@Override
public void noPermission(List<String> denied, boolean quick) {
public void noPermission(List<String> denied, boolean never) {
ToastUtils.show("获取通知栏权限失败,请手动授予权限");
}
});
Expand All @@ -194,13 +193,13 @@ public void hasPermission(List<String> granted, boolean all) {
}

@Override
public void noPermission(List<String> denied, boolean quick) {
public void noPermission(List<String> denied, boolean never) {
ToastUtils.show("获取系统设置权限失败,请手动授予权限");
}
});
break;
case R.id.btn_main_app_details:
XXPermissions.startApplicationDetails(MainActivity.this);
XXPermissions.startApplicationDetails(this);
break;
default:
break;
Expand Down
12 changes: 6 additions & 6 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="请求危险权限" />
android:text="申请单个危险权限" />

<Button
android:id="@+id/btn_main_request_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="不断请求危险权限" />
android:text="申请多个危险权限" />

<Button
android:id="@+id/btn_main_request_3"
Expand All @@ -39,31 +39,31 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="请求安装包权限" />
android:text="申请安装包权限" />

<Button
android:id="@+id/btn_main_request_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="请求悬浮窗权限" />
android:text="申请悬浮窗权限" />

<Button
android:id="@+id/btn_main_request_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="请求通知栏权限" />
android:text="申请通知栏权限" />

<Button
android:id="@+id/btn_main_request_7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="请求系统设置权限" />
android:text="申请系统设置权限" />

<Button
android:id="@+id/btn_main_app_details"
Expand Down
11 changes: 10 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

buildscript {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
maven { url 'https://jitpack.io' }
jcenter()
google()
}
Expand All @@ -13,9 +15,16 @@ buildscript {

allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/central/' }
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()
maven {url "https://jitpack.io"}
}

//解决app:mockableAndroidJar错误的问题
Expand Down
Loading

0 comments on commit f6e929b

Please sign in to comment.