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