2015-09-11 38 views
6

有人可以做我做錯了的事情......我想要使用SurfaceView捕獲具有預覽屏幕的圖像。我能夠在表面視圖上顯示預覽。Android:Camera2傳遞給攝像頭服務的不良參數

這是我的代碼來捕捉圖像

if (mCameraSession == null && mCameraDevice == null) return; 

    ImageReader reader = ImageReader.newInstance(mTexturePreviewSize.getWidth(), 
          mTexturePreviewSize.getHeight(), 
          ImageFormat.JPEG, 1); 
    reader.setOnImageAvailableListener(imageAvailableListener, mBackgroundHandler); 

    Surface surface = reader.getSurface(); 
    try { 

     CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     requestBuilder.addTarget(surface); 
     mCameraSession.capture(requestBuilder.build(), sessionCaptureListener, null); 

下面是我收到的錯誤消息。

java.lang.IllegalArgumentException: Bad argument passed to camera service 
     at android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:114) 
     at android.hardware.camera2.utils.CameraBinderDecorator$CameraBinderDecoratorListener.onAfterInvocation(CameraBinderDecorator.java:73) 
     at android.hardware.camera2.utils.Decorator.invoke(Decorator.java:81) 
     at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
     at $Proxy2.submitRequestList(Unknown Source) 
     at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:617) 
     at android.hardware.camera2.impl.CameraDeviceImpl.capture(CameraDeviceImpl.java:503) 
     at android.hardware.camera2.impl.CameraCaptureSessionImpl.capture(CameraCaptureSessionImpl.java:161) 
     at Control.CameraApi21Plus.captureSinglePhoto(CameraApi21Plus.java:171) 
     at com.CameraActivity$2.onClick(CameraActivity.java:108) 

捕捉單張照片的功能:

public void captureSinglePhoto() { 

    if (mCameraSession == null && mCameraDevice == null) return; 

    ImageReader reader = ImageReader.newInstance(mTexturePreviewSize.getWidth(), 
      mTexturePreviewSize.getHeight(), 
      ImageFormat.JPEG, 1); 
    reader.setOnImageAvailableListener(imageAvailableListener, mBackgroundHandler); 

    Surface surface = reader.getSurface(); 
    try { 

     CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     requestBuilder.addTarget(surface); 

     mCameraSession.stopRepeating(); 
     mCameraSession.capture(requestBuilder.build(), sessionCaptureListener, null); 

    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

private ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener() 
{ 
    @Override 
    public void onImageAvailable(ImageReader reader) { 
     Image img = reader.acquireLatestImage(); 
    } 
}; 

private CameraCaptureSession.CaptureCallback sessionCaptureListener = new CameraCaptureSession.CaptureCallback() { 
    @Override 
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { 
     //super.onCaptureCompleted(session, request, result); 
    } 
}; 

回答

7

您只能捕捉到爲會話配置的表面,因此您應該在創建會話之前準備表面。

在公文:

拋出:IllegalArgumentException如果被未配置爲用於此會話輸出請求的目標沒有曲面或曲面 ; ...

就像有,你需要有表面mImageReader.getSurface()準備在創建會話

  mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 
        ... 
       }, null); 

官方樣片:

https://github.com/googlesamples/android-Camera2Basic/tree/master/Application/src/main/java/com/example/android/camera2basic

+0

我想給打勾到迪奧達,但你的一個更直接。我看了一下這個樣本,那裏有太多的東西AF,AE我不知道它是如何在相機中工作的。我對相機瞭解不多。 – LittleFunny

+0

是的,相機流量實際上相當複雜。如果你只想拍一張照片,你應該使用Camera Intent,http://developer.android.com/training/camera/photobasics.html,祝你好運 –

+0

而且,TBH,如果你瞭解細節,你就會知道Diyoda的聲稱'你正在打電話給一個封閉的會議'實際上並非如此,即你可以看到你的預覽。 –

1

在Camera2 API,

CameraCaptureSession文件引用,

如果一個新的會話是由相機創建設備,則之前的 會話將關閉,並且其關聯的onClosed cal lback將調用 。如果在會話關閉後調用所有會話方法,將拋出IllegalStateException。

因此,正如文檔所暗示的,您正在調用一個封閉的會話。找出這個。我可以幫助你更多的代碼。

此外,我希望你在模仿Camera2 API示例代碼。如果不是,我建議你看看it