安卓开发控件学习——使用 PreviewView预览相机画面

1,254 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

前言

PreviewView是属于CameraX组件的内容,也是我们的Jetpack库中的组件内容,我们可以用PreviewView去实现预览我们的相机画面。

正文

为什么使用CameraX?

这点官方已经告诉了我们:

image.png

接下来我们将使用它的预览视图PreviewView,看看它的效果。

image.png 我们用Kotlin语言开发,因为用到摄像头,所以需要摄像头权限,首先就需要去把我们的摄像头权限注册到清单文件:

image.png

代码如下:

<uses-permission android:name="android.permission.CAMERA"/>

以及需要在setting.gradle文件中加入我们的google()(有些创建项目模式自带):

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

接着我们在app目录的build.gradle文件中的android块中加入下面代码(有些创建项目模式自带):

android {
    ....
    ....

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

接着把我们需要的CameraX依赖导入我们模块里(这里是app/build.gradle):

dependencies {

    ....

    // The following line is optional, as the core library is included indirectly by camera-camera2
    implementation 'androidx.camera:camera-core:1.3.0-alpha04'
    implementation 'androidx.camera:camera-camera2:1.3.0-alpha04'
    // If you want to additionally use the CameraX Lifecycle library
    implementation 'androidx.camera:camera-lifecycle:1.3.0-alpha04'
    // If you want to additionally use the CameraX VideoCapture library
    implementation 'androidx.camera:camera-video:1.3.0-alpha04'
    // If you want to additionally use the CameraX View class
    implementation 'androidx.camera:camera-view:1.3.0-alpha04'
    // If you want to additionally add CameraX ML Kit Vision Integration
    implementation 'androidx.camera:camera-mlkit-vision:1.3.0-alpha04'
    // If you want to additionally use the CameraX Extensions library
    implementation 'androidx.camera:camera-extensions:1.3.0-alpha04'
}

版本用最新的即可。

看了官方的说明,CameraX的功能太丰富了,有空还得仔细看,言归正传,我们回到 PreviewView上,接下来我们把布局给安置好:

<FrameLayout
    android:id="@+id/container"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</FrameLayout>

然后在Activity中构建相应代码与配置:
第一步请求CameraProvider:

private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        ....
        ....

        //请求CameraProvider
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }

接着我们去动态请求摄像机权限(这块代码我们下一篇聊,这里我们先在app的设置权限里给相机权限授权使用中允许),然后去添加CameraProvider监听去创建预览

cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))

我们用bindPreview()方法创建预览和相关配置与绑定流程:

private fun bindPreview(cameraProvider : ProcessCameraProvider) {

    val imageCapture = ImageCapture.Builder().build()
    //创建preview
    val preview : Preview = Preview.Builder()
        .build()
    //创建配置
    val cameraSelector : CameraSelector = CameraSelector.Builder()
        //后置相机(指定镜头)
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()
    //preview绑定previewView
    preview.setSurfaceProvider(binding.previewView.surfaceProvider)

    //将选择的相机和配置用例与生命周期绑定
    cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview, imageCapture)
}

运行程序,我们就能得到下面的效果:

微信图片_20230304232526.jpg

可以看到我们成功的将后置摄像机镜头画面预览在我们的app页面上。

总结

其实CameraX的功能很多,从拍照到视频都能自定义,甚至还能指定镜头数量,有空可以多看看使用的方法,后面再出一篇。