【1】github地址
https://github.com/guolindev/PermissionX
【2】添加依賴
implementation 'com.guolindev.permissionx:permissionx:1.6.4'
【3】聲明權(quán)限
在 AndroidManifest.xml 中聲明權(quán)限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CALL_PHONE" />
【4】請求權(quán)限代碼
// 獲取權(quán)限
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:是否所有權(quán)限都授予
grantedList:已被授予權(quán)限的列表
deniedList:未被授予權(quán)限的列表
【4】解釋必須請求的原因
使用 PermissionX 的 onExplainRequestReason 方法棠隐,向用戶解釋為什么要請求這些權(quán)限,或者向用戶體現(xiàn)權(quán)限的重要性。
// 獲取權(quán)限
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()) "聯(lián)系人權(quán)限" else "、聯(lián)系人權(quán)限"
Manifest.permission.CAMERA -> permissions += if (permissions.isEmpty()) "相機(jī)權(quán)限" else "、相機(jī)權(quán)限"
Manifest.permission.CALL_PHONE -> permissions += if (permissions.isEmpty()) "電話權(quán)限權(quán)限" else "痪蝇、電話權(quán)限"
else -> permissions
}
}
scope.showRequestReasonDialog(deniedList,
"請再次確認(rèn)是否需要 $permissions。\n如果不需要冕房,部分功能無法使用躏啰。", "確認(rè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()
}
}
當(dāng)用戶拒絕權(quán)限請求后,會彈出解釋性請求對話框:
該對話框默認(rèn)是在請求權(quán)限之后執(zhí)行耙册,如果想要在請求權(quán)限之前執(zhí)行给僵,則需要使用:
.explainReasonBeforeRequest()
【5】打開設(shè)置,手動打開權(quán)限
.onForwardToSettings { scope, deniedList ->
scope.showForwardToSettingsDialog(deniedList, "打開設(shè)置頁面详拙,手動打開權(quán)限", "OK", "Cancel")
}
使用 onForwardToSettings 方法想际,當(dāng)檢測到權(quán)限被拒時,彈出對話框溪厘,
讓用戶選擇是否打開設(shè)置頁面胡本,讓用戶手動打開對應(yīng)的權(quán)限。
【6】檢查是否有某權(quán)限
if (ContextCompat.checkSelfPermission(this@DataActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
} else {
ActivityCompat.requestPermissions(this@DataActivity, arrayOf(Manifest.permission.CALL_PHONE), 1)
}
【7】有關(guān)對話框
onExplainRequestReason 和 onForwardToSettings 是 PermissionX 自帶的兩種對話框畸悬,并且支持深色主題侧甫。
但是,這兩種對話框樣式比較單一蹋宦,如果有必要披粟,不要使用 onExplainRequestReason 和 onForwardToSettings,
在實際項目中冷冗,我們更多的是自定義對話框守屉。
【8】RxPermission
除了 PermissionX 之外,RxPermission也是一個不錯的選擇蒿辙。
Rx系列<第二十九篇>:RxPermission - 簡書 (jianshu.com)
RxPermission 用法 - 簡書 (jianshu.com)
[本章完...]