Intereting Posts
«Незарегистрированное приложение» показано на экране согласия в Google+ Брандмауэр Android с VpnService Использование buildToolsVersion 23 выходит из строя, потому что несколько файлов dex определяют 'AnimRes' Хотите создать плагин в Cocos2d для моего SDK Как программно загрузить Html-страницу в android и получить ее Html? Программно удалить SMS не работает Вращение ImageView в Android <Уровень API 11 Как добавить два цвета в панель выполнения в Android? Retrofit2 Условие обработки, когда код состояния 200, но структура json отличается от класса datamodel Как изменить цвет стрелки назад в новой теме материала? Android-переменные в strings.xml Использование диспетчера аварийных сообщений даже если приложение закрыто? Как остановить обслуживание самостоятельно? Сделать пустой вид займет оставшееся пространство после RecyclerView? Отмена регистрации слушателей в onDestroy – какой вред / может они протекать?

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

Solutions Collecting From Web of "Android: Camera2 Плохой аргумент, переданный службе камеры"

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

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

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 ,

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

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

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