«SurfaceView BufferQueue была заброшена» при использовании CameraxViewFinder Composable с AnimatedVisibubiteAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 «SurfaceView BufferQueue была заброшена» при использовании CameraxViewFinder Composable с AnimatedVisibubite

Сообщение Anonymous »

Я пытаюсь реализовать функцию камеры в мое приложение для 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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