Я пытаюсь реализовать функцию камеры в мое приложение для Android. Я использую JetPack Compose, и я увидел, что они обновили библиотеку камер, чтобы поддержать ее. Я следовал этим средним урокам:
Часть 1: https://medium.com/androiddevelopers/ge ... 1c722ca0c4
Часть 2: https://medium.com/androiddevelopers/ta ... 0853280a6e
и сначала это работало. Затем я попытался добавить немного наложения в предварительный просмотр камеры, например, информационный текст, чтобы объяснить пользователю, что делать. И если я сделаю: < /p>
uiState.surfaceRequest?.let { request ->
CameraXViewfinder(
surfaceRequest = request,
modifier = modifier
.fillMaxSize()
)
Row (
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.padding(
end = 48.dp,
bottom = dimensionResource(R.dimen.padding_medium)
)
.background(Color.LightGray.copy(alpha = 0.5f), MaterialTheme.shapes.small)
.width(275.dp)
) {
Text(
text = "Scan a qr code or point at a place to see more details about it!",
modifier = Modifier
.padding(dimensionResource(R.dimen.padding_small))
)
}
< /code>
все еще работает нормально. Но я решил, что хочу добавить кнопку, которая при нажатии покажет строку, и через 5 секунд она исчезнет, например: < /p>
@Composable
fun CameraScreen(
modifier: Modifier = Modifier,
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
cameraViewModel: CameraViewModel = CameraViewModel(),
) {
val uiState = cameraViewModel.uiState.collectAsStateWithLifecycle().value
val context = LocalContext.current
LaunchedEffect(lifecycleOwner) {
cameraViewModel.bindToCamera(context.applicationContext, lifecycleOwner)
}
uiState.surfaceRequest?.let { request ->
CameraXViewfinder(
surfaceRequest = request,
modifier = modifier
.fillMaxSize()
)
Box(
contentAlignment = Alignment.BottomEnd,
modifier = Modifier
.fillMaxSize()
) {
AnimatedVisibility(
visible = uiState.isInfoScreenOpen
) {
LaunchedEffect(Unit) {
delay(5000)
cameraViewModel.toggleInfoScreen()
}
Row (
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.padding(
end = 48.dp,
bottom = dimensionResource(R.dimen.padding_medium)
)
.background(Color.LightGray.copy(alpha = 0.5f), MaterialTheme.shapes.small)
.width(275.dp)
) {
Text(
text = "Scan a qr code or point at a place to see more details about it!",
modifier = Modifier
.padding(dimensionResource(R.dimen.padding_small))
)
}
}
IconButton(
onClick = cameraViewModel::toggleInfoScreen
) {
Icon(
painter = painterResource(R.drawable.round_info_outline_24),
contentDescription = "Info button",
tint = Color.White
)
}
}
}
}
< /code>
Он больше не работает, и когда я нажимаю кнопку или задержку прохождения экрана исчезает, и я вижу только фон, и я получаю «Bufferqueue Surface View Bufferqueue» была отменена »в LogCat. < /p>
my uistate class: < /p>
data class CameraUiState (
// Used to set up a link between the Camera and your UI.
val surfaceRequest: SurfaceRequest? = null,
val qrContent: Uri? = null,
val isInfoScreenOpen: Boolean = true
)
< /code>
my viewModel Code: < /p>
private val _uiState = MutableStateFlow(CameraUiState())
val uiState: StateFlow = _uiState.asStateFlow()
private val executor = Executors.newSingleThreadExecutor()
private val cameraPreview = Preview.Builder().build().apply {
setSurfaceProvider { newSurfaceRequest ->
_uiState.update {
it.copy(
surfaceRequest = newSurfaceRequest
)
}
}
}
fun toggleInfoScreen() {
_uiState.update {
it.copy(
isInfoScreenOpen = !it.isInfoScreenOpen
)
}
}
suspend fun bindToCamera(appContext: Context, lifecycleOwner: LifecycleOwner) {
val processCameraProvider = ProcessCameraProvider.awaitInstance(appContext)
processCameraProvider.bindToLifecycle(
lifecycleOwner, DEFAULT_BACK_CAMERA, cameraPreview, imageAnalysis
)
// Cancellation signals we're done with the camera
try { awaitCancellation() } finally { processCameraProvider.unbindAll() }
}
< /code>
Я попытался вывести Surfacerequest из Uistate, чтобы он был собран отдельно, поэтому он не зависел от других полей Uistate. Я попытался переместить призыв к созданию ViewModel в Navhost, а не непосредственно в композицию, но это дает мне ту же ошибку, даже не запустив камеру. Я попытался выдвинуть весь код, кроме CameraxViewFinder из блока let, чтобы он не зависел от существующего SurfaceRequest, и он рендерирует перед камерой, да, но после того, как я нажимаю кнопку, все это исчезает, то есть как представление камеры, так и композитные кнопки камеры и кнопки. Сначала я попытался реализовать каркас в качестве контейнера, а кнопка была кнопкой плавающего действия, потому что я думал, что это будет проще. Я попытался завернуть код, показанный выше, в другой поле, чтобы упростить код, а затем я удалил весь контейнер с обертыванием. Я пытался скопировать как можно больше кода со второй части среднего урока, и я не вижу логических различий между этим и моим решением. Я попытался попросить ИИ без результата. Я не знаю, что еще делать, и я не понимаю, как это исправить, потому что я не понимаю, почему это происходит.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... viewfinder
«SurfaceView BufferQueue была заброшена» при использовании CameraxViewFinder Composable с AnimatedVisibubite ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как передать параметр в параметр @Composable из @Composable, где первый из них вложен?
Anonymous » » в форуме Android - 0 Ответы
- 76 Просмотры
-
Последнее сообщение Anonymous
-