我的项目使用CameraSource来检测QR码。我的CameraSource的代码基于official one(略微修改以添加一些日志和类似的东西)。 实际上,应用程序由2个活动组成(我正在简化行为):
我的CameraSource实现在onCreate中实例化,并有回调,特别是“surfaceCreated”和“surfaceDestroyed”:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e(TAG, "CAMERA SURFACE DESTROYING VIEW");
cameraSource.stop();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e(TAG, "CAMERA SURFACE CREATED");
try {
cameraSource.start(cameraView.getHolder());
//getCameraFocusInfo();
} catch (IOException ie) {
Log.e(TAG, ie.getMessage());
}
}
问题是在模拟器上第二个活动崩溃,因为它无法打开相机。在真实设备上,我看到略有不同的日志(但没有崩溃)。
记录第一个活动(两者都相同):
E / FORM PRODUCT IN:创建
E / FORM PRODUCT IN:On Resume
E / FORM PRODUC IN IN:CAMERA SURFACE CREATED
E / FORM PRODUC IN IN:CAMERA SURFACE CHANGED:宽度768高度:1134
检测到条形码,然后是第二次登录(在Genymotion上)和应用程序崩溃:
E / FORM PRODUCT IN:暂停时
E / PRODUCT IN:创建
E / PRODUCT IN:On Resume
E / PRODUCT IN:CAMERA SURFACE CREATED
E / AndroidRuntime:FATAL EXCEPTION:main
Process: it.example, PID: 15231 java.lang.RuntimeException: Fail to connect to camera service
第二次登录设备(应用程序不会崩溃但报告错误):
E / FORM PRODUCT IN:暂停时
E / PRODUCT IN:创建
E / PRODUCT IN:On Resume
E / PRODUCT IN:CAMERA SURFACE CREATED
E / PRODUCT IN:CAMERA SURFACE CHANGED:宽度720高度:1232
E /相机:错误2
E / FORM PRODUC IN IN:CAMERA SURFACE DESTROYING VIEW
E / OpenCameraSource:无法清除相机预览:java.io.IOException:setPreviewTexture failedE / FORM PRODUCT IN:停止
没关系,如果应用程序在模拟器上崩溃,但设备上的日志告诉我当我尝试打开相机时出现问题,因为它尚未发布。
第二个活动的OnCreate和OnResume(以及相对新的相机表面视图的创建)在第一个活动的onStop之前被调用,并且在第二个活动之后调用表面破坏调用(负责释放相机)开始了。
是否有正确的方法在2个不同的活动中正确使用相机?
答案 0 :(得分:0)
实际上我解决了找到一个类似问题的正确答案here。 在此解释以供将来参考。
要强制销毁SurfaceView(包含相机预览),只需更改可见性(在我的情况下为View.GONE)。
由于第一个活动的onPause总是在第二个活动的onCreate之前被调用,因此解决方案是使视图在onPause上不可见(因此调用停止相机的onSurfaceDestroyed),然后在onResume上再次显示它。
@Override
protected void onPause() {
super.onPause();
cameraView.setVisibility(View.GONE);
Log.e(TAG, "On Pause");
}
@Override
protected void onResume() {
super.onResume();
cameraView.setVisibility(View.VISIBLE);
Log.e(TAG, "On Resume");
}