应用后台运行一分钟后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
相关产品推荐
相关产品推荐

