Android CameraX绑定用例时重启应用出现ViewPort为NULL问题求助
问题原因
PreviewView.getViewPort() 只有在控件完成至少一次测量、布局流程之后才会返回非空值。你当前的 bindAllCameraUseCases() 调用时机过早,应用重启(Activity/Fragment 重新创建)时,用例绑定逻辑的执行时序早于 PreviewView 的布局完成回调,就会触发空值报错。首次启动时因为初始化链路耗时更长,PreviewView 刚好在绑定用例前完成了布局,所以不会出现问题。
修复方案
- 方案1:监听 PreviewView 布局完成事件后再执行用例绑定
把原有直接调用bindAllCameraUseCases()的逻辑替换为布局监听逻辑,确保只有 PreviewView 绘制完成后才触发绑定:PreviewView previewView = findViewById(R.id.preview_view); previewView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // 移除重复监听避免多次触发 previewView.getViewTreeObserver().removeOnPreDrawListener(this); // 执行用例绑定 bindAllCameraUseCases(); return true; } }); - 方案2:临时兜底逻辑(不需要多UseCase尺寸对齐的场景可用)
如果暂时不需要保证预览、拍照、分析输出的尺寸比例和 PreviewView 完全一致,可以跳过 ViewPort 配置,直接绑定多个用例:// 替换原有UseCaseGroup构建+绑定的代码段 camera = cameraProvider.bindToLifecycle(this, cameraSelector, previewUseCase, analysisUseCase, imageCaptureUseCase);
注意事项
不要在 onCreate/onViewCreated 等生命周期回调里直接调用用例绑定逻辑,页面销毁重建的场景下,系统恢复页面状态的速度远快于首次启动,大概率会出现绑定逻辑早于控件布局完成的情况。
内容的提问来源于stack exchange,提问作者simulatoris
相关产品推荐
相关产品推荐

