Android:Camera2错误参数传递给相机服务
Posted
技术标签:
【中文标题】Android:Camera2错误参数传递给相机服务【英文标题】:Android: Camera2 Bad argument passed to camera service 【发布时间】:2015-12-07 14:32:37 【问题描述】:有人知道我做错了什么吗...我想使用 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);
;
【问题讨论】:
【参考方案1】:您只能捕获到为会话配置的表面,因此您应该在创建会话之前准备表面。
在官方文档中:
IllegalArgumentException 如果请求没有针对 Surface 或 未配置为此会话的输出的表面; ...
就像那里一样,您需要在创建会话时准备好表面 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
【讨论】:
我想打勾Diyoda,但你的打勾更直接。我看了样本,AF、AE 里面的东西太多了,我不知道它在相机中是如何工作的。我对相机了解不多。 是的,相机流实际上是相当复杂的。如果你只想拍照,你应该使用Camera Intent,developer.android.com/training/camera/photobasics.html,祝你好运 而且,TBH,如果您了解详细信息,您会知道 Diyoda 对you are calling a closed session
的声明实际上并非如此,即您可以看到您的预览。
你是对的..Derek.. 我知道我还没有关闭会话,但没有意识到我必须在列表中添加额外的表面。现在我已经摆脱了那股力量。我想现在我必须将相机设置为 setRepeatRequest 才能再次运行预览。【参考方案2】:
在 Camera2 API 中,
引用CameraCaptureSession
的文档,
如果相机设备创建了一个新会话,那么之前的 会话关闭,其关联的 onClosed 回调将 被调用。所有的会话方法都会抛出一个 如果在会话关闭后调用 IllegalStateException。
因此,正如文档所暗示的那样,您正在调用一个封闭的会话。找出来。我可以帮助你们中的更多人编写更多代码。
另外,我希望你在模仿Camera2 API示例代码。如果不是,我建议你看看it。
【讨论】:
以上是关于Android:Camera2错误参数传递给相机服务的主要内容,如果未能解决你的问题,请参考以下文章
如何将单独的参数传递给 Xamarin Android C# 中的 ListView.ItemClick 调用