Camera2 android - 相机设备遇到致命错误摄像头设备需要重新打开才能再次使用

如何解决Camera2 android - 相机设备遇到致命错误摄像头设备需要重新打开才能再次使用

我该如何纠正这个持续性错误

我在没有摄像头的安卓系统上使用 OTG 摄像头。

我为 YUV_420_888 使用了最小分辨率 320x240。 第一次,有时第二次它有效,之后我不断收到错误消息: 相机设备遇到致命错误。摄像头设备需要重新打开才能再次使用。

在这个想法中,我打开相机和会话持续 15 秒(由处理程序),然后它自动关闭。 谢谢

我的 API(不是全部)

static public CaptureRequest.Builder preparePreviewCapture(@NonNull CameraDevice device,@NonNull List<Surface> surfaces) throws Exception {
    try {

        CaptureRequest.Builder requestBuilder = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        ApiCompatHelper.foreach(surfaces,(surfaceIterator,integer,surface) -> {
            requestBuilder.addTarget(surface);
            return false;
        });
        return requestBuilder;
    } catch (Exception e)
    {
        e.getStackTrace();
        throw new Exception(e.getCause());
    }
}
static public void createCaptureSession(@NonNull CameraDevice device,@NonNull CameraCaptureSession.StateCallback callback,@NonNull List<Surface> surfaces) throws SecurityException,Exception {
    device.createCaptureSession(surfaces,callback,mBackgroundHandler /*null*/);
}
static public void repeatRequest(@NonNull CameraCaptureSession session,@NonNull CaptureRequest.Builder builder,@Nullable CameraCaptureSession.CaptureCallback captureCallback) throws CameraAccessException {
    //builder.set(CaptureRequest.CONTROL_MODE,CameraMetadata.CONTROL_MODE_AUTO);
    session.setRepeatingRequest(builder.build(),captureCallback,mBackgroundHandler);
}
public static void openCamera(final String cameraId,CameraStateCallback callback) throws ExceptionInInitializerError,CameraAccessException,SecurityException {

    if (mBackgroundHandler == null) throw new ExceptionInInitializerError("You must execute startBackgroundThread() in first");

    mManager.openCamera(cameraId,new CameraDevice.StateCallback() {

        @Override
        public void onClosed(@NonNull CameraDevice camera) {
            LogHelper.debugFunction(false);
            super.onClosed(camera);
            callback.onClosed(camera);
        }

        @Override
        public void onopened(@NonNull CameraDevice cameraDevice) {
            LogHelper.debugFunction(false);
            callback.onopened(cameraDevice);
        }

        @Override
        public void ondisconnected(@NonNull CameraDevice cameraDevice) {
            LogHelper.debugFunction(false);
            callback.ondisconnected(cameraDevice);
        }

        @Override
        public void onError(@NonNull CameraDevice cameraDevice,int error) {
            LogHelper.debugFunction(false);
            callback.onError(cameraDevice,error);

        }

    },mBackgroundHandler);

}

打开和关闭

 private void openCamera() {
    if (!CameraApi2Utils.checkPermissionsGranted(this)) {
        CameraApi2Utils.requestPermissions(this);
        return;
    }

    String id = "0";

    try {
        
        if (mCameraDevice == null) {
            CameraApi2Utils.openCamera(id,this);
        } else {
            //
        }
    } catch (Exception e) {
        e.printstacktrace();
        closeCamera(true);
    }
}
private void closeCamera(boolean initvar) {
     SafeUtils.execSafe(() -> mTaskHandler,false,(t)-> {
        t.removeCallbacks(mStopCameraRunnable);
    });


    if (initvar)
    {
    }

        mCameraCaptureSessions = null;

        SafeUtils.execSafe(()->mCameraDevice,(d)->d.close());
        mCameraDevice = null;

        SafeUtils.execSafe(()->mPreviewImageReader,(i)-> i.close());
        mPreviewImageReader = null;

}

会话和图像阅读器

protected void prepareInternalPreviewCapture() throws Exception {
    if (mPreviewImageReader == null) {
        mPreviewImageReader = CameraApi2Utils.prepareInternalCapture(mLowResolution,ImageFormat.YUV_420_888,2,reader -> {
            if (RendererHelper.calculFps(fps)) {
                LogHelper.debug("fps: %d - %dx%d",fps[2],reader.getWidth(),reader.getHeight());
            }

        
            try (Image image = reader.acquireLatestimage()) {
                if (image != null) {
                    boolean preview = DataVolatileHelper.get("preview",false);
                    if (preview) {
                        byte[] imageBytes = GraphicHelper.NV21toJPEG(
                                GraphicHelper.YUV_420_888toNV21(image),image.getWidth(),image.getHeight(),20);

                        SafeUtils.execSafe(() -> BitmapFactory.decodeByteArray(imageBytes,imageBytes.length),(b) -> {
                            if (mPreviewHandler != null)
                                mPreviewHandler.post(new PreviewRunnable(b,0));
                        },(b) -> b.recycle(),null);
                    }
                }
            }
        });
    }

}
protected void createCameraPreviewSession() {
    try {

        prepareInternalPreviewCapture();

        Surface surface = mPreviewImageReader.getSurface();

        mPreviewbuilder = CameraApi2Utils.preparePreviewCapture(mCameraDevice,surface);

        CameraApi2Utils.createCaptureSession(mCameraDevice,new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                try {
                    if (mTaskHandler != null) {
                        mTaskHandler.removeCallbacks(mStopCameraRunnable);
                        mTaskHandler.postDelayed(mStopCameraRunnable,15000);
                    }

                    if (mCameraDevice == null) {
                        LogHelper.debug("mCameraDevice == null");
                        closeCamera(true);
                        return;
                    }

                    // When the session is ready,we start displaying the preview.
                    mCameraCaptureSessions = session;

                    mPreviewbuilder.set(CaptureRequest.CONTROL_MODE,CameraMetadata.CONTROL_MODE_AUTO);
                    CameraApi2Utils.repeatRequest(mCameraCaptureSessions,mPreviewbuilder,(CameraCaptureSession.CaptureCallback) null);

                } catch (Exception e) {
                    e.printstacktrace();
                    closeCamera(true);
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                closeCamera(true);
            }
        },surface);

    } catch (Exception e) {
        e.printstacktrace();
        closeCamera(true);
    }
}

活动

@Override
public void onopened(@NonNull CameraDevice camera) {
    mCameraDevice = camera;

    //SafeUtils.set("camera",camera);
    //SafeUtils.releaseSafe("camera");

    SafeUtils.execSafe(() -> mTaskHandler,(t)-> {
        t.removeCallbacks(mStopCameraRunnable);
        t.postDelayed(mStopCameraRunnable,20000);
    });

            createCameraPreviewSession();
}

@Override
public void ondisconnected(@NonNull CameraDevice camera) {
    closeCamera(true);
}

@Override
public void onError(@NonNull CameraDevice camera,int error) {
    LogHelper.error(CameraApi2Utils.getErrorDescription(error));
    if (error == CameraDevice.StateCallback.ERROR_CAMERA_DEVICE )
    {
        closeCamera(false);
        SafeUtils.execSafe(()->mTaskHandler,(t)-> t.postDelayed(()->openCamera(),2000));
    } else
        closeCamera(true);

}

@Override
public void onClosed(@NonNull CameraDevice camera) {
}

Runnable mStopCameraRunnable = new Runnable() {
    @Override
    public void run() {
        SafeUtils.execSafe(()->mTaskHandler,(t)->t.removeCallbacks(mStopCameraRunnable));
        closeCamera(true);
    }
};

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?