为什么抛出`UnsupportedOperationException`试图将SurfaceView与相机相关联?

时间:2017-08-31 23:11:01

标签: java android android-camera surface android-camera2

我想使用Surface类显示相机胶片:

SurfaceView view = (SurfaceView) findViewById(R.id.camera_view);
Surface appSurface = view.getHolder().getSurface();

我将Surface对象传递给CameraManager API:

CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
manager.openCamera(
    manager.getCameraIdList()[0],
    new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {                
          // Why this line throws an exception?
          camera.createCaptureSession(
              Collections.singletonList(appSurface),
              new CameraCaptureSession.StateCallback() {...},
              null);
        }

        // other @Override methods
        ...
    },
    new Handler(getMainLooper())
);

并收到以下例外:

FATAL EXCEPTION: main                                                                                            
Process: com.google.android.apps.internal.smartcamera.tagger, PID: 8563                                                                                             
java.lang.UnsupportedOperationException: Unknown error -22                                                                                                  
at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:77)                                                                                                    
at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:583)                                                                                                   
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:68)

似乎SurfaceUtils类(它是一段原生c代码)无法正确读取Surface大小。的为什么吗

2 个答案:

答案 0 :(得分:3)

Surface是指向它的源的弱指针。

你的ImageReader超出范围,收集垃圾,相机设备进入废弃的表面,并抛出异常。时间有点随机,这就是为什么你总是看不到这一点。

将您的图像阅读器存放在持久的位置(无论如何都要使用它来从中检索图像)。

答案 1 :(得分:0)

尝试将此添加到Manafiest.xml。

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />