Проблема здесь возникает, когда пользователь находится в режиме просмотра камеры (где он может либо нажать «ОК», чтобы отправить сделанный снимок, либо отменить его) и нажимает на аппаратное обеспечение. кнопку «Назад» или кнопку «Отмена». В этом случае вид с камеры закрывается, и когда они снова нажимают «Сделать снимок», ничего не происходит.
У меня есть такой код:
Код: Выделить всё
@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
)
}
}
Есть ли что-то, что мне здесь не хватает? Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... t-click-on