Класс RequestMultiplePermissions
Класс ActivityResultContracts.RequestMultiplePermissions
принимает массив имён permission
и возвращает карту имя-к granted.
Регистрируют его через
rememberLauncherForActivityResult.
Каждое право должно быть в
uses-permission.
Для одного права проще
RequestPermission.
Синтаксис
ActivityResultContracts.RequestMultiplePermissions()
Пример
Давайте запросим камеру и микрофон одним launch:
import android.Manifest
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions(),
) { map ->
val all = map.values.all { it }
label = if (all) "12345" else "abcde"
}
Button(onClick = {
launcher.launch(
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
),
)
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране система покажет последовательность
диалогов, текст станет "12345",
если пользователь выдал все права.
Пример
Давайте проверим только камеру в карте результата:
import android.Manifest
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions(),
) { map ->
val cam = map[Manifest.permission.CAMERA] == true
label = if (cam) "12345" else "abcde"
}
Button(onClick = {
launcher.launch(
arrayOf(Manifest.permission.CAMERA),
)
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране текст сменится на "12345",
если камера разрешена, даже при одном ключе в массиве.
Смотрите также
-
класс
RequestPermission,
контракт для одной строки permission -
метод
launch,
куда передают arrayOf permissions -
метод
checkSelfPermission,
проверка до показа диалогов -
тег
uses-permission,
список прав в манифесте