java - 为什么尝试将 SurfaceView 与相机关联时抛出 `UnsupportedOperationException` ?

标签 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 类(这是一段 native C 代码)似乎无法正确读取 Surface 大小。 为什么?

最佳答案

Surface 是一个弱指针,指向其获取源。

您的 ImageReader 超出了范围,并进行了垃圾收集,并且相机设备遇到了废弃的表面,并引发了异常。时间会有些随机,这就是为什么你不会总是看到这一点。

将图像读取器存储在某个持久的位置(无论如何你都必须使用它来检索图像)。

关于java - 为什么尝试将 SurfaceView 与相机关联时抛出 `UnsupportedOperationException` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991307/

相关文章:

java - 代码 : to initialize a variable, 和简单声明哪个更好?

android - 如何在 xml 中显示 ChipGroup 中的占位符 Chip?

Android检测硬件缩放按钮

android - AWB 不自信

java - 解析时访问 JSON 值

java - @Component Hibernate 类

java - java中有没有更好的方法将对象添加到ArrayList中?每次我尝试添加或设置新内容时,它都会将整个数组更改为该对象

android - 多个dex文件定义Landroid/support/design/widget/CoordinatorLayout$LayoutParams

android - 不使用 actionBar.newTab() 实现 Android Tabs

android - 如何从相机 Intent 中捕捉视频?