Я пытаюсь реализовать функцию камеры в мое приложение для 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
Форум для тех, кто программирует под Android
1742063308
Anonymous
Я пытаюсь реализовать функцию камеры в мое приложение для Android. Я использую JetPack Compose, и я увидел, что они обновили библиотеку камер, чтобы поддержать ее. Я следовал этим средним урокам:
Часть 1: https://medium.com/androiddevelopers/getting-started-with-camerax-in-jetpack-compose-781c722ca0c4
Часть 2: https://medium.com/androiddevelopers/tap-to-focus-mastering-camerax-transformations-in-jetpack-compose-440853280a6e
и сначала это работало. Затем я попытался добавить немного наложения в предварительный просмотр камеры, например, информационный текст, чтобы объяснить пользователю, что делать. И если я сделаю: < /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, и он рендерирует перед камерой, да, но после того, как я нажимаю кнопку, все это исчезает, то есть как представление камеры, так и композитные кнопки камеры и кнопки. Сначала я попытался реализовать каркас в качестве контейнера, а кнопка была кнопкой плавающего действия, потому что я думал, что это будет проще. Я попытался завернуть код, показанный выше, в другой поле, чтобы упростить код, а затем я удалил весь контейнер с обертыванием. Я пытался скопировать как можно больше кода со второй части среднего урока, и я не вижу логических различий между этим и моим решением. Я попытался попросить ИИ без результата. Я не знаю, что еще делать, и я не понимаю, как это исправить, потому что я не понимаю, почему это происходит.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79507848/surfaceview-bufferqueue-has-been-abandoned-error-when-using-cameraxviewfinder[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия