Jetpack Compose: после того, как вы сделали снимок и нажали кнопку «Назад», пользователи не могут снова нажать «Сделать Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Jetpack Compose: после того, как вы сделали снимок и нажали кнопку «Назад», пользователи не могут снова нажать «Сделать

Сообщение Anonymous »

Я использую Jetpack Compose, и у меня есть модальный нижний лист, на котором пользователи могут нажать «Сделать снимок», когда нижний лист появится. Затем они попадают в вид с камеры и, сделав снимок, нажимают «ОК», и снимок будет загружен на сервер. Пока все хорошо.
Проблема здесь возникает, когда пользователь находится в режиме просмотра камеры (где он может либо нажать «ОК», чтобы отправить сделанный снимок, либо отменить его) и нажимает на аппаратное обеспечение. кнопку «Назад» или кнопку «Отмена». В этом случае вид с камеры закрывается, и когда они снова нажимают «Сделать снимок», ничего не происходит.
У меня есть такой код:

Код: Выделить всё

@Composable
fun AppModalBottomSheet(
onShowBottomSheetChanged: (Boolean) -> Unit,
onPictureTaken: (File, Long) -> Unit,
onError: () -> Unit
) {
var shouldShowCameraView by remember { mutableStateOf(false) }
var shouldShowRationale by remember { mutableStateOf(false) }
var shouldCheckForPermissions by remember { mutableStateOf(false) }
val multiplePermissionsLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
if (it.values.find { granted -> !granted } == true) {
shouldShowRationale = true
}
}
val permissionLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) {
shouldShowCameraView = true
shouldShowRationale = false
} else {
shouldShowCameraView = false
shouldShowRationale = true
}
}

val checkForMultiplePermissions: @Composable (MultiplePermissionsState) -> Unit = {
val permissionState = rememberMultiplePermissionsState(
listOf(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
)
LaunchedEffect(key1 = Unit) {
multiplePermissionsLauncher.launch(
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
)
}
when (permissionState.allPermissionsGranted) {
true -> {
shouldShowCameraView = true
shouldShowRationale = false
}

false -> {
shouldShowCameraView = false
shouldShowRationale = true
}
}
}
val checkForSinglePermission: @Composable (PermissionState) -> Unit = {
val permissionState = rememberPermissionState(Manifest.permission.CAMERA)
LaunchedEffect(key1 = Unit) {
permissionLauncher.launch(Manifest.permission.CAMERA)
}
when (permissionState.status) {
is PermissionStatus.Denied -> {
shouldShowCameraView = false
shouldShowRationale = true
}

PermissionStatus.Granted -> {
shouldShowCameraView = true
shouldShowRationale = false
}
}
}
}

@Composable
private fun ShowCamera(
onPictureTaken: (file: File, fileSize: Long) -> Unit,
onError: () -> Unit,
) {
val context = LocalContext.current
val imageFile = remember { createImageFile(context) }
val file = imageFile.getOrElse { onError.invoke() } as? File
val fileUri = file?.let { FileUtils.uri(context, file) }
val cameraLauncher =
rememberLauncherForActivityResult(contract = ActivityResultContracts.TakePicture()) {
if (it) {
fileUri?.let { uri ->
val fileSize = FileUtils.fileSize(context, uri)
onPictureTaken(file, fileSize)
}
}
}
LaunchedEffect(key1 = Unit) {
cameraLauncher.launch(fileUri)
}
}

private fun createImageFile(context: Context): Result {
val timeStamp: String =
SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val imageFileName = "JPEG_" + timeStamp + "_"
val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return runCatching {
File.createTempFile(
imageFileName,
".jpeg",
storageDir
)
}
}
После щелчка назад, когда они находятся в поле зрения камеры, во время отладки я устанавливаю точку останова в строке с if (shouldShowCameraView) { и вижу, что mustShowCameraView$delegate истинно, но функция ShowCamera() никогда не вызывается.
Есть ли что-то, что мне здесь не хватает? Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... t-click-on
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»