如何将 CameraX 与 PreviewView 一起使用?

Posted

技术标签:

【中文标题】如何将 CameraX 与 PreviewView 一起使用?【英文标题】:How to use CameraX with PreviewView? 【发布时间】:2020-06-03 16:16:57 【问题描述】:

我不知道如何将 camerax 与 previewview 一起使用。

【问题讨论】:

【参考方案1】:

这是一个如何使用CameraxPreviewView 的示例,代码使用最新版本的CameraX,即camera-camera2 版本为1.1.0-alpha08,camera-view 版本为1.0.0-alpha28。

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        previewView = view.findViewById(R.id.preview_view);
  

        setCameraProviderListener();

    
private void setCameraProviderListener() 
        ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
                ProcessCameraProvider.getInstance(requireContext());
        cameraProviderFuture.addListener(() -> 

            try 
                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                bindPreview(cameraProvider);
             catch (ExecutionException | InterruptedException e) 
                // No errors need to be handled for this Future
                // This should never be reached
                e.printStackTrace();
            
        , ContextCompat.getMainExecutor(requireContext()));
    
 private void bindPreview(ProcessCameraProvider cameraProvider) 
        
 previewView.setPreferredImplementationMode(PreviewView.ImplementationMode.SURFACE_VIEW);

        Preview preview = new Preview.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3).
                setTargetRotation(previewView.getDisplay().getRotation())
                .build();


        CameraSelector cameraSelector =
                new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();

        preview.setSurfaceProvider(previewView.getSurfaceProvider());

   UseCaseGroup useCaseGroup = new UseCaseGroup.Builder()
                .addUseCase(preview)
                .addUseCase(imageCapture)//use this case if you want take picture or videoCapture for videoRecording
                .build();


        cameraProvider.bindToLifecycle(this, cameraSelector,preview);

    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_
    android:layout_>

    <androidx.camera.view.PreviewView
        android:id="@+id/preview_view"
        android:layout_
        android:layout_
        android:background="@color/Yellow"
        android:layout_gravity="center" />

</LinearLayout>

【讨论】:

如何设置TextureView而不是PreviewView,无法设置Preview preview.setSurfaceProvider(textureView.getSurfaceProvider());在最新版本 1.0.0-rc01 中显示错误 你必须在 preview.setSurfaceProvider() 中使用 previewView.getSurfaceProvider() 而不是 textureView.getSurfaceProvider() 谢谢@MohamedBenRomdhane,你的回答很有魅力,我刚刚对 preview.setSurfaceProvider() 进行了调整,在 1.0.0-alpha14 版本上更改了 previewView.createSurfaceProvider() 的 getSurfaceProvider 跨度> @MohamedBenRomdhane 这是我开始项目时使用的版本,现在我必须升级它。 Soooo,你到底把那段代码放在哪里了?对于某些人来说,这真的不明显。【参考方案2】:

Here 是一篇解释PreviewView 及其使用方法的文章。它在相机视图的 1.0.0-alpha10 版本之前有效,我会尽量保持最新。

【讨论】:

【参考方案3】:

我在调试不同错误时设置了android:hardwareAccelerated="false",但忘记将其删除(或将其设置为true)。我很快注意到相机功能已停止工作。

确保您的应用清单中没有 android:hardwareAccelerated="false"。如果有,请将其删除,或将其设置为 true。如果设置为false,则会影响相机预览流。

TL;DR

删除清单中的任何android:hardwareAccelerated="false",或将其设置为true

【讨论】:

以上是关于如何将 CameraX 与 PreviewView 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

使用 PreviewView 来展示相机预览

如何使用 CameraX 拍摄多张图像?

如何在 MediaCodec 编码器和 CameraX 之间共享 Surface

如何将 CameraView 与 Jetpack Compose 一起使用?

CameraX 库如何打开/关闭手电筒?