Я пытаюсь запросить разрешения, необходимые моему приложению, но не могу открыть окно разрешений.
Вот мой составной объект:
@Composable
fun IntroScreen(
introViewModel: IntroViewModel = hiltViewModel(),
navController: NavController
){
val requestPermissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissionsMap ->
permissionsMap.forEach { (permission, isGranted) ->
Log.i("tag", "Permission: $permission, Granted: $isGranted")
}
}
val permissions = introViewModel.permissions
val permissionsState by introViewModel.permissionsState.collectAsState()
Column(
modifier = Modifier
.fillMaxWidth(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
){
Button(onClick = {
Log.i("tag", "Permissions state: ${permissionsState.joinToString(separator = ", ")}")
val allPermissionsGranted = permissionsState.all { it }
Log.i("tag", "All permissions granted: $allPermissionsGranted")
if (!allPermissionsGranted) {
// Request permissions
Log.i("tag", "Requesting permissions inside if statement: ${permissions.joinToString(", ")}")
requestPermissionLauncher.launch(permissions)
} else {
Log.i("tag", "All permissions already granted")
}
}, shape = Shapes.small) {
Text(text = "Ask Permissions")
}
}
Вот моя модель представления:
@HiltViewModel
class IntroViewModel @Inject constructor(private val context: Context, introInteractor:IntroInteractor):ViewModel(){
private val _permissionsState = MutableStateFlow(emptyList())
val permissionsState: StateFlow get() = _permissionsState
val permissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.CAMERA,
Manifest.permission.INTERNET
)
init {
updatePermissionsState()
}
fun updatePermissionsState() {
val permissionsStateList = permissions.map { permission ->
ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
}
_permissionsState.value = permissionsStateList
}
}
Я сделал код максимально простым. И все зарегистрированные операторы возвращают ожидаемые результаты. Разрешения Интернета, Bluetooth и Bluetooth верны, а остальные ложны. Я попытался удалить те, которые соответствуют действительности, но окно не появилось.
Мой код достигает «requestPermissionLauncher.launch(permissions)», и параметры для launch() верны. Почему я не могу открыть окно?
Это результат журнала внутри моего оператора if перед моей программой запуска:
"Запрос разрешений внутри оператора if: android.permission. ACCESS_COARSE_LOCATION, android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_BACKGROUND_LOCATION, android.permission.BLUETOOTH, android.permission.BLUETOOTH_ADMIN, android.permission.BLUETOOTH_SCAN, android.permission.BLUETOOTH_ADVERTISE, android.permission.POST_NOTIFICATIONS, android.permission.КАМЕРА, android.permission.INTERNET
".
Примечание: я тестирую на реальном Galaxy A14, и мой файл манифеста:
Подробнее здесь: https://stackoverflow.com/questions/789 ... auncher-la