如何在 Android 的 camera2 中正确使用新的 createCaptureSession()?

How to correctly use the new createCaptureSession() in camera2 in Android?

已弃用的 createCaptureSession() 方法在旧代码中的使用方式如下:

cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
     @Override
     public void onConfigured(@NonNull CameraCaptureSession session) {
         if (mycameraDevice == null){
             return;
         }
         cameraCaptureSession = session;
         if (cameraDevice == null){
             return;
         }
         captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
         try {
             cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
         } catch (CameraAccessException e) {
             e.printStackTrace();
         }
     }
     @Override
     public void onConfigureFailed(@NonNull CameraCaptureSession session) {
         Toast.makeText(MainActivity.this, "Configuration Failed! :(", Toast.LENGTH_SHORT).show();
     }
 }, null); 

我还发现了 ,其中规定我们必须做类似的事情:

SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, Collections.singletonList(outputConfiguration), new HandlerExecutor(mCameraHandler.getLooper()), mCameraSessionListener);
cameraDevice.createCaptureSession(sessionConfiguration);

首先,这样的使用方式是否正确,如果是,那么什么是outputConfiguration,如何正确声明?在 Youtube 教程中,从未创建任何 outputConfiguration!

那么我需要进行哪些更改才能再次使用该代码?

您没有理由不继续使用已弃用的 createCaptureSession 版本 - 它的工作原理与以前一样好。您只需忽略 Android Studio 弃用警告。

基本上,随着时间的推移,我们不得不添加更多的 createCaptureSession 重载,参数和可选参数的变体越来越多,而且越来越多。

因此我们创建了 SessionConfiguration 作为配置对象,随着时间的推移它会更加灵活(更容易向其添加新参数),再设置一个接受它的 createCaptureSession,并弃用所有先前版本以指导人们如果我们再次设计 API,我们今天将添加的那个。

如果你想使用最新的选项,那么你可以看一下 OutputConfiguration(它只是包装了输出表面列表以及一些其他可选设置) - 你可以只用 surface 您在示例代码中输入了 Arrays.asList() 调用。

但您可以继续使用现有的 - 我们实际上不会破坏旧方法。