Класс RequestPermission
Класс ActivityResultContracts.RequestPermission
- контракт для одной строки
android.permission.*.
Его передают в
rememberLauncherForActivityResult,
а в launch
отдают имя разрешения.
В манифесте право заранее объявляют
uses-permission,
проверку делают
checkSelfPermission.
Синтаксис
ActivityResultContracts.RequestPermission()
Пример
Давайте запросим камеру и обновим текст:
import android.Manifest
import android.content.pm.PackageManager
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
import androidx.core.content.ContextCompat
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission(),
) { granted ->
label = if (granted) "12345" else "abcde"
}
Button(onClick = {
val ok = ContextCompat.checkSelfPermission(
this@MainActivity,
Manifest.permission.CAMERA,
) == PackageManager.PERMISSION_GRANTED
if (!ok) {
launcher.launch(Manifest.permission.CAMERA)
} else {
label = "12345"
}
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране при отсутствии права launch
покажет системный диалог, иначе сразу "12345".
Пример
Давайте запросим уведомления на новых API:
import android.Manifest
import android.os.Bundle
import android.os.Build
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.RequestPermission(),
) { granted ->
label = if (granted) "12345" else "abcde"
}
Button(onClick = {
if (Build.VERSION.SDK_INT >= 33) {
launcher.launch(
Manifest.permission.POST_NOTIFICATIONS,
)
}
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране на API 33+ появится запрос POST_NOTIFICATIONS, текст сменится по ответу.
Смотрите также
-
класс
RequestMultiplePermissions,
когда нужно несколько строк сразу -
метод
shouldShowRequestPermissionRationale,
перед повторным launch -
тег
uses-permission,
обязательное объявление в манифесте -
класс
ActivityResultLauncher,
который вызывают с этим контрактом