Класс PickVisualMedia
Класс ActivityResultContracts.PickVisualMedia
показывает Photo Picker или галерею
и возвращает Uri выбранного файла
или null, если пользователь отменил.
В launch
передают
PickVisualMediaRequest
с типом ImageOnly или VideoOnly.
На части устройств отдельное READ permission
не нужно благодаря picker.
Синтаксис
ActivityResultContracts.PickVisualMedia()
Пример
Давайте выберем одно изображение:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.PickVisualMediaRequest
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.PickVisualMedia(),
) { uri ->
label = if (uri != null) "12345" else "abcde"
}
Button(onClick = {
launcher.launch(
PickVisualMediaRequest(
ActivityResultContracts.PickVisualMedia.ImageOnly,
),
)
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране после выбора файла текст
станет "12345", при отмене останется "abcde".
Пример
Давайте разрешим только видео:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.PickVisualMediaRequest
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.PickVisualMedia(),
) { uri ->
label = if (uri != null) "12345" else "abcde"
}
Button(onClick = {
launcher.launch(
PickVisualMediaRequest(
ActivityResultContracts.PickVisualMedia.VideoOnly,
),
)
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
На экране системный picker покажет только видео, результат отразится в тексте.
Смотрите также
-
класс
StartActivityForResult,
общий контракт для любого intent -
функция
rememberLauncherForActivityResult,
где регистрируют PickVisualMedia -
тег
uses-permission,
если на старых API нужен READ_MEDIA -
метод
launch,
который передаёт PickVisualMediaRequest