无法从第二个活动

时间:2017-03-27 09:49:44

标签: android camera

我的项目使用CameraSource来检测QR码。我的CameraSource的代码基于official one(略微修改以添加一些日志和类似的东西)。 实际上,应用程序由2个活动组成(我正在简化行为):

  1. 第一个活动(FORM PRODUCT IN)有一些信息文本和一个带摄像头预览的框架。检测到条形码时,会将代码传递给第二个活动
  2. 第二项活动(PRODUCT IN)与第一项活动类似,但扫描不同的条形码(必须是单独的活动)
  3. 我的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 failed

         

    E / FORM PRODUCT IN:停止

    没关系,如果应用程序在模拟器上崩溃,但设备上的日志告诉我当我尝试打开相机时出现问题,因为它尚未发布。

    第二个活动的OnCreate和OnResume(以及相对新的相机表面视图的创建)在第一个活动的onStop之前被调用,并且在第二个活动之后调用表面破坏调用(负责释放相机)开始了。

    是否有正确的方法在2个不同的活动中正确使用相机?

1 个答案:

答案 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");
}