如何将 CameraX 与 PreviewView 一起使用?
Posted
技术标签:
【中文标题】如何将 CameraX 与 PreviewView 一起使用?【英文标题】:How to use CameraX with PreviewView? 【发布时间】:2020-06-03 16:16:57 【问题描述】:我不知道如何将 camerax 与 previewview 一起使用。
【问题讨论】:
【参考方案1】:这是一个如何使用Camerax
和PreviewView
的示例,代码使用最新版本的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实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作
如何在 MediaCodec 编码器和 CameraX 之间共享 Surface