簡體   English   中英

如何處理 Jetpack Compose 中被拒絕的權限

[英]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 permissionButton 當用戶單擊 Button 時,它會詢問運行時權限。 它詢問了 2 個選項AllowDenied 當用戶被拒絕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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM