2017-08-31 109 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在這裏不起作用。 –

相關問題