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);
официальный образец:
В Camera2 API,
Цитирование из документации CameraCaptureSession
,
Если устройство камеры создает новый сеанс, то предыдущий сеанс закрывается, и вызывается связанный с ним обратный вызов onClosed. Все методы сеанса генерируют исключение IllegalStateException, если оно вызывается после закрытия сеанса.
Итак, как следует из документации, вы вызываете закрытый сеанс. выясни это. Я могу помочь немного больше из вас, чтобы добавить больше кода.
А также, я надеюсь, что вы имитируете пример кода API Camera2. Если я не предлагаю вам взглянуть на него.