You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11下CameraX结合Compose Navigation出现随机崩溃

CameraX 结合 Compose Navigation 在 Android 11 上随机崩溃

在 Android 11 设备上,我的应用使用 CameraX 搭配 Compose Navigation 时会出现随机崩溃:有时打开底部导航的相机标签页时崩溃,有时离开该页面时崩溃,有时需要切换 2-3 次才会触发崩溃,但在 Android 12 上运行完全正常。已排除权限相关问题。

相关代码

MainActivity

@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)
            }
        }
    }
}

BottomNavigationBar

@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)
            }
            ...
           )
        }
    }
}

LotusNavGraph

@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()
            }
        }
    }
}

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<Preview?>(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生命周期日志

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

内容的提问来源于stack exchange,提问作者andrei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:38:13