Android: Camera2 Плохой аргумент передан службе камеры

Может кто-нибудь, что я сделал не так... Я хотел, чтобы захватить изображение, которое у меня есть экран предварительного просмотра, используя SurfaceView. Я могу показать предварительный просмотр на поверхности.

Это мой код для захвата изображения

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);
    }
};

2 ответа

Решение

Вы можете захватить только поверхность, настроенную для сеанса, поэтому вам следует подготовить поверхность до создания сеанса.

В официальном документе:

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

В Camera2 API,

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

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

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

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

Другие вопросы по тегам