У меня проблема, очень похожая на эту.
Я столкнулся со сбоем в своем приложении при использовании CameraX с Compose Navigation. Проблема возникает непоследовательно: иногда происходит сбой при открытии нижней вкладки навигационной камеры, а иногда происходит сбой при переходе. В других случаях для навигации требуется 2 или 3 раза, пока не произойдет сбой. Проблема возникает на Android 11, но на Android 12 все работает нормально.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
var isBottomNavigationVisible by remember { mutableStateOf(false) }
navController.addOnDestinationChangedListener { _, destination, _ ->
isBottomNavigationVisible = destination.route?.startsWith(Destination.HomeScreen.route) == true
}
Scaffold(
bottomBar = {
if (isBottomNavigationVisible) {
BottomNavigationBar(navController = navController)
}
}
) { innerPadding ->
LotusNavGraph(navController, innerPadding)
}
}
}
}
@Composable
fun BottomNavigationBar(navController: NavHostController) {
...
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
NavigationBar {
items.forEach { item ->
val isSelected = currentDestination?.hierarchy?.any { it.route == item.route } == true
NavigationBarItem(selected = isSelected, onClick = {
navController.navigate(item.route)
}
...
)
}
}
}
@Composable
fun LotusNavGraph(navController: NavHostController, innerPadding: PaddingValues) {
NavHost(
navController = navController,
startDestination = Destination.HomeScreen.route,
modifier = Modifier.padding(innerPadding)
) {
navigation(
startDestination = Destination.BottomNavigation.TicketsSection.route,
route = Destination.HomeScreen.route
) {
...
composable(Destination.BottomNavigation.ControlSection.route) {
ControlRoute()
}
}
}
}
@Composable
fun ControlRoute() {
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current
val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) }
val cameraProvider = remember { cameraProviderFuture.get() }
val executor = remember(context) { ContextCompat.getMainExecutor(context) }
var imageCapture: ImageCapture? by remember { mutableStateOf(null) }
var preview by remember { mutableStateOf
(null) }
var lensFacing by remember { mutableIntStateOf(CameraSelector.LENS_FACING_BACK) }
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { ctx ->
val previewView = PreviewView(ctx)
cameraProviderFuture.addListener({
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build()
imageCapture = ImageCapture.Builder()
.setTargetRotation(previewView.display.rotation)
.build()
preview = Preview.Builder().build().also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner, cameraSelector, imageCapture, preview
)
}, executor)
previewView
},
modifier = Modifier.fillMaxSize()
)
}
}
Я удалил логику разрешений, так как уверен, что это не причина сбоя.
Информация журналов
Камера:
{Camera@46f57cd[id=0]} Transitioning camera internal state: CLOSING --> INITIALIZED
Recalculating open cameras:
Camera State
-------------------------------------------------------------------
Camera@46f57cd[id=0] CLOSED
Camera@3d12ace[id=1] UNKNOWN
-------------------------------------------------------------------
Open count: 0 (Max allowed: 1)
New public camera state CameraState{type=CLOSED, error=null} from CLOSED and null
Publishing new public camera state CameraState{type=CLOSED, error=null}
ImageReader_JNI Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers
Жизненный цикл поверхности:
Surface destroyed.
Surface closed androidx.camera.core.SurfaceRequest@316af04
surface closed, useCount=1 closed=true androidx.camera.core.SurfaceRequest$2@b13eced
surface closed, useCount=0 closed=true androidx.camera.core.processing.SurfaceEdge$SettableSurface@1ed96b1
Surface terminated[total_surfaces=2, used_surfaces=1](androidx.camera.core.processing.SurfaceEdge$SettableSurface@1ed96b1}
use count-1, useCount=0 closed=true androidx.camera.core.SurfaceRequest$2@b13eced
Surface no longer in use[total_surfaces=2, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@b13eced}
Surface terminated[total_surfaces=1, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@b13eced}
Safe to release surface.
{Camera@46f57cd[id=0]} Use case androidx.camera.core.ImageCapture-be36803c-93ad-4eea-a1d0-8d855f812b99106716812 ACTIVE
Active and attached use case: [] for camera: 0
Surface created[total_surfaces=3, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@8f91d90}
New surface in use[total_surfaces=3, used_surfaces=1](androidx.camera.core.SurfaceRequest$2@8f91d90}
Прямо перед остановкой приложения:
runtime.cc:655] Runtime aborting...
runtime.cc:655] Dumping all threads without mutator lock held
runtime.cc:655] All threads:
runtime.cc:655] DALVIK THREADS (22):
runtime.cc:655] "hwuiTask1" prio=6 tid=25 Runnable
...
Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 3795
Подробнее здесь: https://stackoverflow.com/questions/786 ... android-11
Сбой при работе CameraX и создания навигации на Android 11 ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1719564186
Anonymous
У меня проблема, очень похожая на эту.
Я столкнулся со сбоем в своем приложении при использовании CameraX с Compose Navigation. Проблема возникает непоследовательно: иногда происходит сбой при открытии нижней вкладки навигационной камеры, а иногда происходит сбой при переходе. В других случаях для навигации требуется 2 или 3 раза, пока не произойдет сбой. Проблема возникает на Android 11, но на Android 12 все работает нормально.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
var isBottomNavigationVisible by remember { mutableStateOf(false) }
navController.addOnDestinationChangedListener { _, destination, _ ->
isBottomNavigationVisible = destination.route?.startsWith(Destination.HomeScreen.route) == true
}
Scaffold(
bottomBar = {
if (isBottomNavigationVisible) {
BottomNavigationBar(navController = navController)
}
}
) { innerPadding ->
LotusNavGraph(navController, innerPadding)
}
}
}
}
@Composable
fun BottomNavigationBar(navController: NavHostController) {
...
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
NavigationBar {
items.forEach { item ->
val isSelected = currentDestination?.hierarchy?.any { it.route == item.route } == true
NavigationBarItem(selected = isSelected, onClick = {
navController.navigate(item.route)
}
...
)
}
}
}
@Composable
fun LotusNavGraph(navController: NavHostController, innerPadding: PaddingValues) {
NavHost(
navController = navController,
startDestination = Destination.HomeScreen.route,
modifier = Modifier.padding(innerPadding)
) {
navigation(
startDestination = Destination.BottomNavigation.TicketsSection.route,
route = Destination.HomeScreen.route
) {
...
composable(Destination.BottomNavigation.ControlSection.route) {
ControlRoute()
}
}
}
}
@Composable
fun ControlRoute() {
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current
val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) }
val cameraProvider = remember { cameraProviderFuture.get() }
val executor = remember(context) { ContextCompat.getMainExecutor(context) }
var imageCapture: ImageCapture? by remember { mutableStateOf(null) }
var preview by remember { mutableStateOf
(null) }
var lensFacing by remember { mutableIntStateOf(CameraSelector.LENS_FACING_BACK) }
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { ctx ->
val previewView = PreviewView(ctx)
cameraProviderFuture.addListener({
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build()
imageCapture = ImageCapture.Builder()
.setTargetRotation(previewView.display.rotation)
.build()
preview = Preview.Builder().build().also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner, cameraSelector, imageCapture, preview
)
}, executor)
previewView
},
modifier = Modifier.fillMaxSize()
)
}
}
Я удалил логику разрешений, так как уверен, что это не причина сбоя.
Информация журналов
Камера:
{Camera@46f57cd[id=0]} Transitioning camera internal state: CLOSING --> INITIALIZED
Recalculating open cameras:
Camera State
-------------------------------------------------------------------
Camera@46f57cd[id=0] CLOSED
Camera@3d12ace[id=1] UNKNOWN
-------------------------------------------------------------------
Open count: 0 (Max allowed: 1)
New public camera state CameraState{type=CLOSED, error=null} from CLOSED and null
Publishing new public camera state CameraState{type=CLOSED, error=null}
ImageReader_JNI Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers
Жизненный цикл поверхности:
Surface destroyed.
Surface closed androidx.camera.core.SurfaceRequest@316af04
surface closed, useCount=1 closed=true androidx.camera.core.SurfaceRequest$2@b13eced
surface closed, useCount=0 closed=true androidx.camera.core.processing.SurfaceEdge$SettableSurface@1ed96b1
Surface terminated[total_surfaces=2, used_surfaces=1](androidx.camera.core.processing.SurfaceEdge$SettableSurface@1ed96b1}
use count-1, useCount=0 closed=true androidx.camera.core.SurfaceRequest$2@b13eced
Surface no longer in use[total_surfaces=2, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@b13eced}
Surface terminated[total_surfaces=1, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@b13eced}
Safe to release surface.
{Camera@46f57cd[id=0]} Use case androidx.camera.core.ImageCapture-be36803c-93ad-4eea-a1d0-8d855f812b99106716812 ACTIVE
Active and attached use case: [] for camera: 0
Surface created[total_surfaces=3, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@8f91d90}
New surface in use[total_surfaces=3, used_surfaces=1](androidx.camera.core.SurfaceRequest$2@8f91d90}
Прямо перед остановкой приложения:
runtime.cc:655] Runtime aborting...
runtime.cc:655] Dumping all threads without mutator lock held
runtime.cc:655] All threads:
runtime.cc:655] DALVIK THREADS (22):
runtime.cc:655] "hwuiTask1" prio=6 tid=25 Runnable
...
Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 3795
Подробнее здесь: [url]https://stackoverflow.com/questions/78681460/crash-with-camerax-and-compose-navigation-on-android-11[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия