为什么registerForActivityResult总是返回相同的结果?

问题描述 投票:0回答:1

当我第一次和第二次按下开关时,请求对话框显示并按下不允许开关正常工作。 但是当我第三次按下 switch 时,请求对话框没有显示,我总是得到 isGranted 的值为 false

我该怎么办? 我想创建 UI 开关来启用/禁用 POST_NOTIFICATION

class MainActivity : ComponentActivity() {

var mIsChecked = false
val permissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted ->
    mIsChecked = isGranted
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContent {
        var isSwitchChecked by remember { mutableStateOf(mIsChecked) }
        MyComposeApplicationTheme {
            // A surface container using the 'background' color from the theme
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                Switch(
                    checked = isSwitchChecked,
                    onCheckedChange = {
                        if (it) {
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                                permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
                            }
                        } else {
                            isSwitchChecked = it
                        }
                    }
                )
            }
        }
    }
}

}

android android-fragments android-jetpack-compose android-permissions
1个回答
0
投票

您只能请求 Android 运行时权限非常有限的次数。如果您看到系统对话框向用户请求一次或最多两次权限,那么下次您调用

permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
时,操作系统将忽略该权限请求,因为您不能垃圾邮件此类请求。

此外,当您通过权限请求授予权限时,任何后续对

permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
的调用都只会返回
granted
结果。

相反,您应该做的是跟踪当前的权限状态,并且仅在您打算让用户授予权限时才显示权限请求。

我会让开关的状态等同于你从

ContextCompat.checkSelfPermission()
得到的任何状态,并且仅请求权限以授予它们,而不是意图拒绝它们。同样,我不建议您尝试创建手动“拒绝”权限的流程,因为这不是标准或推荐的做法;用户可以随时进入您应用的设置并手动关闭任何不需要的权限。 最后,我还建议您

阅读他们的文档

,以更深入地解释权限如何工作以及权限请求流程的最佳实践。

© www.soinside.com 2019 - 2024. All rights reserved.