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)
[本章完...]