[英]How to handle permission denied in jetpack compose
大家好,我想處理 Jetpack Compose 中被拒絕的許可。 到目前為止,我發現PermissionsRequired
方法對我的情況很有幫助。 我遇到了一個問題,我稍后會詳細解釋。 首先,我將解釋我在這個 function 中做了什么。
class BluetoothRequestActivity : BaseActivity() {
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
)
} else {
listOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AbcTheme {
AppBarScaffold() {
val multiplePermissionsState = rememberMultiplePermissionsState(permissions = permissions)
PermissionsRequired(
multiplePermissionsState = multiplePermissionsState,
permissionsNotGrantedContent = {
setupBluetoothRequest(multiplePermissionsState)
},
permissionsNotAvailableContent = {
setupBluetoothRequest(openPermissionSetting = true)
}
) {}
}
}
}
}
@Composable
private fun setupBluetoothRequest(
multiplePermissionsState: MultiplePermissionsState? = null,
openPermissionSetting: Boolean = false
) {
BluetoothRequest(
multiplePermissionsState = multiplePermissionsState,
openPermissionSetting = openPermissionSetting,
onCancelClick = {
finish()
}
)
}
}
當用戶第一次打開活動permissionsNotGrantedContent
時,它會顯示請求權限的按鈕。 現在,當用戶拒絕權限並單擊不再詢問選項時,我通過permissionsNotAvailableContent
更改了視圖,將觸發和按鈕功能更改以打開系統設置。 我這樣做沒有任何問題。
主要問題
所有事情都發生了,然后我關閉了我的活動並重新打開了活動。 我的PermissionsRequired
總是觸發permissionsNotGrantedContent
這個 function 這是錯誤的。 現在根據流程用戶永久禁用對話框所以為什么這是觸發器我想處理這個 function setupBluetoothRequest(openPermissionSetting = true)
。 知道如何解決這個問題嗎? 謝謝
更新
我有 4 個場景,當第一個用戶登陸屏幕時我想顯示Text - Abc wants permission
和Button
。 當用戶單擊 Button 時,它會詢問運行時權限。 它詢問了 2 個選項Allow和Denied 。 當用戶被拒絕2 次時,我想在Text- you denied please manual open setting and give permission
。 如果用戶允許,那么我想顯示Text - Permission granted
。 我毫無問題地完成了所有這 3 個場景。 當用戶拒絕權限 2 次時,它會顯示Text- you denied please manual open setting and give permission
,但是當用戶關閉屏幕並重新打開屏幕時,我收到Text - Abc wants permission
,屏幕上的Button
我不想要。 那么我該如何解決這個問題。
setContent {
AbcTheme {
AppBarScaffold() {
val multiplePermissionsState = rememberMultiplePermissionsState(permissions = permissions)
when {
multiplePermissionsState.shouldShowRationale -> {
setupBluetoothRequest(multiplePermissionsState)
}
multiplePermissionsState.permissionRequested -> {
setupBluetoothRequest(openPermissionSetting = true)
}
}
}
}
}
更新 2
從0.23.1
更新到0.25.1
后,我看不到permissionRequested
的選項了。
when {
multiplePermissionsState.allPermissionsGranted -> {
Text(text = "Permission Granted", color = Color.White)
}
multiplePermissionsState.shouldShowRationale ->{
Text(text = "shouldShowRationale", color = Color.White)
}
}
那我現在該怎么處理呢?
Accompanist Permission 庫已更新,因此當您更新庫時此庫將無用,但為了解決您的問題,您可以通過 state 權限確定所需操作
fun mapPermissionStateToAction(permissionState: PermissionState) = when {
permissionState.shouldShowRationale -> {
// Show Permission rationale
}
!permissionState.shouldShowRationale && !permissionState.permissionRequested -> {
// Request permission, no need for rationale
}
!permissionState.shouldShowRationale && permissionState.permissionRequested -> {
// Permission Denied as never to be asked again
}
else -> {
// Permission Granted go ahead and use it
}
}
permissionRequested 字段已刪除。 您可以檢查是否已請求權限的新方法是創建一個最初設置為 false 的標志,並在調用 rememberMultiplePermissionsState 回調時設置為 true。
嘗試這樣的事情:
var permissionRequested by remember { mutableStateOf(false) }
val permissionsState = rememberMultiplePermissionsState(permissions) {
permissionRequested = true
}
// Use permissionRequested
permissionRequested 將在權限對話框關閉時設置為 true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.