2017-08-31 86 views
1

我希望展示的使用面类相机电影:为什么`UnsupportedOperationException`抛出尝试将SurfaceView与相机关联?

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尺寸。 为什么?

回答

0

尝试将此添加到Manafiest.xml。

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

我有他们,这并没有解决问题。 – mercury0114

3

表面是指向它从中获得的源的弱指针。

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

将您的图片阅读器存储在持久存储位置(您必须无论如何都可以使用它来从中检索图片)。

+0

我很欣赏你的评论。但是,将'ImageReader'对象设置为全局变量并没有帮助。在自己做更多的调试之后,我意识到ImageReader根本就不是问题(我修改了这个问题以反映这一点)。问题在于,由于某些原因,从.xml文件获取的** SurfaceView不能与CameraManager类**一起使用。 – mercury0114

+0

从运行应用程序获得完整的logcat输出会很有帮助 - 在故障点,可能会有更多的日志记录而不仅仅是异常。应该没有理由说XML布局的SurfaceView在这里不起作用。 –

相关问题