微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android:Camera2 Bad参数传递给相机服务

有人可能我做错了…我想用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);

官方样本:

https://github.com/googlesamples/android-Camera2Basic/tree/master/Application/src/main/java/com/example/android/camera2basic

原文地址:https://www.jb51.cc/android/310077.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐