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

应用后台运行一分钟后CameraX停止,恢复后无预览黑屏

CameraX后台恢复后黑屏(ERROR_CAMERA_DISABLED)问题解决

问题分析

从日志和代码片段来看,核心问题出在自定义LifecycleOwner未正确处理应用前后台生命周期事件:

  • 应用后台时,SurfaceView已释放,但自定义Lifecycle没有触发相机资源释放的事件,导致CameraX持续占用相机
  • 系统检测到后台应用长时间占用相机,触发ERROR_CAMERA_DISABLED强制关闭相机
  • 恢复应用时,CameraX未重新初始化相机,导致预览黑屏

日志关键提示:

D/Camera2CameraImpl: CameraDevice.onError(): 0 failed with ERROR_CAMERA_DISABLED while in OPENED state. Will attempt recovering from error.

这说明系统因后台相机占用超时,直接禁用了相机设备。

解决方案

1. 替换自定义Lifecycle为系统原生实现

CameraX依赖Lifecycle自动管理相机资源的创建与释放,无需自定义LifecycleOwner。根据组件类型选择对应实现:

若为Application级相机(需后台运行):

使用ProcessLifecycleOwner(需依赖androidx.lifecycle:lifecycle-process库):

// 替换自定义lifecycle为ProcessLifecycleOwner
cameraProvider.bindToLifecycle(ProcessLifecycleOwner.get(), cameraSelector, preview, imageCapture);

若为Activity级相机(仅前台运行):

直接使用Activity自身的Lifecycle(AndroidLauncher若为Activity,本身已实现LifecycleOwner):

cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);

2. 若必须自定义LifecycleOwner(不推荐)

需确保正确分发生命周期事件:

  • 应用进入后台时,调用lifecycleRegistry.markState(Lifecycle.State.CREATED)
  • 应用恢复前台时,调用lifecycleRegistry.markState(Lifecycle.State.RESUMED)

示例实现:

public class CustomLifecycle implements LifecycleOwner {
    private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }

    // 应用切后台时调用
    public void onAppBackgrounded() {
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    // 应用切前台时调用
    public void onAppForegrounded() {
        lifecycleRegistry.markState(Lifecycle.State.RESUMED);
    }
}

3. 验证修复效果

修改后,应用后台时日志应出现相机资源释放的提示:

D/Camera2CameraImpl: CameraDevice closed

恢复应用时,CameraX会自动重新绑定相机,预览正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:04