当我第一次和第二次按下开关时,请求对话框显示并按下不允许开关正常工作。 但是当我第三次按下 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 运行时权限非常有限的次数。如果您看到系统对话框向用户请求一次或最多两次权限,那么下次您调用
permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
时,操作系统将忽略该权限请求,因为您不能垃圾邮件此类请求。
此外,当您通过权限请求授予权限时,任何后续对
permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
的调用都只会返回 granted
结果。
相反,您应该做的是跟踪当前的权限状态,并且仅在您打算让用户授予权限时才显示权限请求。
我会让开关的状态等同于你从
ContextCompat.checkSelfPermission()
得到的任何状态,并且仅请求权限以授予它们,而不是意图拒绝它们。同样,我不建议您尝试创建手动“拒绝”权限的流程,因为这不是标准或推荐的做法;用户可以随时进入您应用的设置并手动关闭任何不需要的权限。
最后,我还建议您阅读他们的文档