有人可能我做错了…我想用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(),mBackgroundHandler); Surface surface = reader.getSurface(); try { CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); requestBuilder.addTarget(surface); mCameraSession.stopRepeating(); mCameraSession.capture(requestBuilder.build(),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); } };
解决方法
您只能捕获为会话配置的曲面,因此您应该在创建会话之前准备曲面.
在官方文件中:
IllegalArgumentException if the request targets no Surfaces or
Surfaces that are not configured as outputs for this session; …
就像那里一样,您需要在创建会话时准备好表面mImageReader.getSurface()
mCameraDevice.createCaptureSession(Arrays.asList(surface,mImageReader.getSurface()),new CameraCaptureSession.StateCallback() { ... },null);
官方样本: