【问题标题】:Why `UnsupportedOperationException` is thrown trying to associate SurfaceView with the camera?为什么在尝试将 SurfaceView 与相机关联时会引发“UnsupportedOperationException”?
【发布时间】:2017-08-31 23:11:01
【问题描述】:

我想使用 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 大小。 为什么?

【问题讨论】:

  • 您找到解决方案了吗?
  • 是的,我忘记了解决方案,因为它不再与我相关。如果有人想要,我可以关闭这个问题。

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


【解决方案1】:

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

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

将您的图像阅读器永久存储在某个地方(无论如何,您都必须使用它从中检索图像)。

【讨论】:

  • 感谢您的评论。但是,将 ImageReader 对象设为全局变量并没有帮助。在自己进行更多调试后,我意识到 ImageReader 根本不是问题(我修改了问题以反映这一点)。问题在于,出于某种原因,从 .xml 文件中获得的 SurfaceView 不与 CameraManager 类一起使用
  • 在运行应用程序时获得完整的 logcat 输出会很有帮助 - 在故障点,可能会有更多的日志记录而不仅仅是异常。没有理由认为来自 XML 布局的 SurfaceView 不能在这里工作。
【解决方案2】:

尝试将其添加到 Manafiest.xml。

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

【讨论】:

  • 我有,但不能解决问题。
猜你喜欢
  • 2011-02-27
  • 2015-04-27
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多