2015-09-11 1 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's требование «вы вызываете закрытую сессию» на самом деле не так, то есть вы можете просмотреть свой предварительный просмотр. –

1

В Camera2 API,

Цитируя документации CameraCaptureSession,

Если новая сессия создается с помощью камеры устройства, то предыдущий сеанс закрыт, а его связанный с закрытым кал lback будет вызываться . Все методы сеанса будут вызывать IllegalStateException, если он вызывается после закрытия сеанса.

Таким образом, как предполагает документация, вы вызываете закрытую сессию. узнайте это. Я могу немного помочь вам добавить больше кода.

А также, я надеюсь, что вы подражаете образцу кода Camera2 API. Если я не предлагаю вам взглянуть на it.

 Смежные вопросы

  • Нет связанных вопросов^_^