Google 在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。
PermissionX是一个扩展Android库,使Android运行时权限请求变得极其容易。你可以将它用于基本的许可请求场合或处理更复杂的情况,如显示理由对话框或手动进入应用程序设置以获得许可。官方网址:https://github.com/guolindev/PermissionX
基本使用
1. 在 build.gradle 文件中添加如下依赖
// 第三方权限框架
// https://github.com/guolindev/PermissionX
implementation 'com.guolindev.permissionx:permissionx:1.7.1'
2. 在 AndroidManifest.xml 中添加声明需要申请的权限。这里添加了读取存储权限、相机权限、电话权限。
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CALL_PHONE" />
3. 使用以下代码进行请求。
PermissionX.init(this).permissions(Manifest.permission.READ_CONTACTS,Manifest.permission.CAMERA,Manifest.permission.CALL_PHONE).request{ allGranted, grantedList, deniedList ->if(allGranted){Toast.makeText(this, "All permissions are granted", Toast.LENGTH_LONG).show()// todo something}else {// deniedList 包含所拒绝的权限Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()// todo something}}
注意:Manifest 一定是要 android 包下的
将一个 Activity 的实例传递到 init 方法中。在 permissions() 方法中添加需要动态申请的权限,然后调用 request 方法进行实际请求。请求结果将在请求 lambda 中回调。
allGranted : Boolean。表示用户是否授权所有的请求。
grantedList:保存用户同意的所有权限。
deniedList:保存用户拒绝的所有权限。
更多使用
如你所知,Android 提供了 shouldShowRequestPermissionRationale 方法来指示我们是否应该显示一个基本原理对话框来向用户解释我们为什么需要该权限。否则用户可能会拒绝我们请求的权限并选中“不再询问”选项。
为了简化这个过程,PermissionX 提供了 onExplainRequestReason 方法。在请求方法之前链接此方法,如果用户拒绝其中一个权限,onExplainRequestReason 方法将首先获得回调。然后你可以调用 showRequestReasonDialog 方法向用户解释为什么这些权限是必须的。
showRequestReasonDialog 方法将提示一个基本原理对话框,第二个参数解释为什么需要这些权限。如果用户点击第三个参数提供的“确定”按钮,PermissionX 将再次请求第一个参数里被拒绝的权限。
第四个参数可选,为“取消”按钮,如果用户点击该按钮,则将取消解释对话框。如果拒绝的权限是必须的,可以不设置第四个参数,对话框将无法取消。这意味着用户必须允许进一步申请这些权限。
当然,用户仍然可以拒绝一些权限,并选中“不再询问”选项。在这种情况下,每次我们再次请求这些权限时都会被自动拒绝。我们唯一能做的就是提示用户需要在应用设置中手动允许这些权限以继续使用。但是 PermissionX 做的更好。
PermissionX 提供 onForwardToSettings 方法来处理这种情况。在请求方法之前链接此方法,如果某些权限被用户“拒绝并且不再询问”,onForwardToSettings 方法将得到回调。然后你可以像下面这样调用 showForwardToSettingDialog 方法。
showForwardToSettingDialog方法中的参数与 showRequestReasonDialog 方法相似。当用户点击肯定按钮时,PermissionX 将转到应用程序的设置页面,用户可以非常快速地打开必要的权限。当用户切换回应用程序时,PermissionX 将自动再次请求必要的权限。