CameraX报TimeoutException:无法在5000ms内完成surfaceList,预览黑屏
我正在使用CameraX 1.1.0版本,跟随Android官方教程开发。初始日志显示正常,但随后触发了TimeoutException,相机预览始终处于黑屏状态。
测试设备:Pixel 4 API 30模拟器、三星A52s真机,二者均出现该问题。代码与教程内容一致,但使用Java语言编写。
日志信息:
(omitted) D/CameraStateRegistry: Recalculating open cameras: Camera State ------------------------------------------------------------------- Camera@f35a3d7[id=0] OPEN Camera@e46a673[id=1] UNKNOWN ------------------------------------------------------------------- Open count: 1 (Max allowed: 1) D/CameraStateMachine: New public camera state CameraState{type=OPEN, error=null} from OPEN and null D/CameraStateMachine: Publishing new public camera state CameraState{type=OPEN, error=null} D/UseCaseAttachState: All use case: [androidx.camera.core.Preview-c7727ae2-d02c-4135-956c-a76c24deb02d40667318] for camera: 0 D/UseCaseAttachState: Active and attached use case: [androidx.camera.core.Preview-c7727ae2-d02c-4135-956c-a76c24deb02d40667318] for camera: 0 D/Camera2CameraImpl: {Camera@f35a3d7[id=0]} Transitioning camera internal state: OPENED --> OPENED D/CameraStateMachine: New public camera state CameraState{type=OPEN, error=StateError{code=4, cause=java.util.concurrent.TimeoutException: Cannot complete surfaceList within 5000}} from OPEN and StateError{code=4, cause=java.util.concurrent.TimeoutException: Cannot complete surfaceList within 5000} D/CameraStateMachine: Publishing new public camera state CameraState{type=OPEN, error=StateError{code=4, cause=java.util.concurrent.TimeoutException: Cannot complete surfaceList within 5000}}
针对这个TimeoutException: Cannot complete surfaceList within 5000导致的预览黑屏问题,给你几个排查方向:
检查PreviewView初始化时机
确保在ProcessCameraProvider初始化完成后再绑定Preview用例,不要在布局未完全加载时执行绑定操作。比如不要在onCreate直接调用绑定逻辑,而是放在onViewCreated或者PreviewView的post方法里,保证Surface已准备就绪。确认权限申请流程
虽然日志显示相机已打开,但仍需确认是否在运行时正确申请了CAMERA权限且用户已授权。部分设备在权限未完全确认时会出现Surface创建超时的情况。升级CameraX版本
CameraX 1.1.0存在一些已知的Surface相关bug,建议升级到1.2.0及以上稳定版本,新版本修复了不少超时和兼容性问题。调整Preview用例配置
避免给Preview设置设备不支持的极端分辨率,尝试使用setTargetAspectRatio让CameraX自动适配最优尺寸:Preview preview = new Preview.Builder() .setTargetAspectRatio(AspectRatio.RATIO_16_9) .build();模拟器特殊排查
Pixel 4 API 30模拟器出现问题时,尝试开启摄像头模拟功能,或者切换到API 31及以上版本的模拟器,旧版本模拟器对CameraX的Surface支持存在缺陷。检查生命周期绑定
确保将CameraProvider与Activity/Fragment的生命周期正确绑定,避免生命周期不一致导致Surface被提前回收:cameraProvider.bindToLifecycle(this, cameraSelector, preview);
内容的提问来源于stack exchange,提问作者stud0709

