PermissionX

2022-07-05  本文已影响0人  NoBugException

【1】github地址

https://github.com/guolindev/PermissionX

【2】添加依赖

implementation 'com.guolindev.permissionx:permissionx:1.6.4'

【3】声明权限

在 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" />

【4】请求权限代码

// 获取权限
PermissionX.init(this@DataActivity)
.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()
    } else {
        Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()
    }
}

allGranted:是否所有权限都授予
grantedList:已被授予权限的列表
deniedList:未被授予权限的列表

【4】解释必须请求的原因

使用 PermissionX 的 onExplainRequestReason 方法,向用户解释为什么要请求这些权限,或者向用户体现权限的重要性。


// 获取权限
PermissionX.init(this@DataActivity)
.permissions(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE)
.onExplainRequestReason { scope, deniedList ->
    var permissions : String = ""
    for (permission : String in deniedList) {
        when(permission) {
            Manifest.permission.READ_CONTACTS -> permissions += if (permissions.isEmpty()) "联系人权限" else "、联系人权限"
            Manifest.permission.CAMERA -> permissions += if (permissions.isEmpty()) "相机权限" else "、相机权限"
            Manifest.permission.CALL_PHONE -> permissions += if (permissions.isEmpty()) "电话权限权限" else "、电话权限"
            else -> permissions
        }
    }
    scope.showRequestReasonDialog(deniedList,
        "请再次确认是否需要 $permissions。\n如果不需要,部分功能无法使用。", "确认", "取消")
}
.request { allGranted, grantedList, deniedList ->
    if (allGranted) {
        Toast.makeText(this, "All permissions are granted", Toast.LENGTH_LONG).show()
    } else {
        Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()
    }
}

当用户拒绝权限请求后,会弹出解释性请求对话框:
image.png
该对话框默认是在请求权限之后执行,如果想要在请求权限之前执行,则需要使用:

.explainReasonBeforeRequest()

【5】打开设置,手动打开权限

.onForwardToSettings { scope, deniedList ->
    scope.showForwardToSettingsDialog(deniedList, "打开设置页面,手动打开权限", "OK", "Cancel")
}

使用 onForwardToSettings  方法,当检测到权限被拒时,弹出对话框,
让用户选择是否打开设置页面,让用户手动打开对应的权限。

【6】检查是否有某权限

    if (ContextCompat.checkSelfPermission(this@DataActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {

    } else {
        ActivityCompat.requestPermissions(this@DataActivity, arrayOf(Manifest.permission.CALL_PHONE), 1)
    }

【7】有关对话框

onExplainRequestReason 和 onForwardToSettings 是 PermissionX 自带的两种对话框,并且支持深色主题。
但是,这两种对话框样式比较单一,如果有必要,不要使用 onExplainRequestReason 和 onForwardToSettings,
在实际项目中,我们更多的是自定义对话框。

【8】RxPermission

除了 PermissionX 之外,RxPermission也是一个不错的选择。

Rx系列<第二十九篇>:RxPermission - 简书 (jianshu.com)

RxPermission 用法 - 简书 (jianshu.com)

[本章完...]

上一篇 下一篇

猜你喜欢

热点阅读