在 Android 中使用 CameraX 显示相机预览

在 Android 中使用 CameraX 显示相机预览

CameraX是一个 Jetpack 支持库,它提供了一个 API 来控制设备的摄像头。这个库允许显示相机预览、捕获图像、执行图像处理。

如果我们想使用 CameraX,我们需要在模块的build.gradle文件中添加依赖项。CameraX 需要属于 Java 8 一部分的方法,因此我们需要添加编译选项。

app/build.gradle

android {
    // Other configuration
    // ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // Other dependencies
    // ...
    implementation 'androidx.camera:camera-camera2:1.0.0-beta07'
    implementation 'androidx.camera:camera-lifecycle:1.0.0-beta07'
    implementation 'androidx.camera:camera-view:1.0.0-alpha14'
}

该应用程序应该能够访问相机设备。因此,我们需要CAMERA在清单文件中请求权限。

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

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

    <application>
        ...
    </application>

</manifest>

在布局 XML 文件中,我们添加了PreviewView用于显示相机预览的元素。

app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.camera.view.PreviewView
        android:id="@+id/myPreviewView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

ContextCompat.checkSelfPermission()使用我们检查是否授予所需权限的方法。如果没有,那么我们通过调用方法请求许可ActivityCompat.requestPermissions()

ProcessCameraProvider我们请求一个允许将相机的生命周期绑定到生命周期所有者的实例。它管理相机的打开和关闭。我们构建一个Preview并将其连接到PreviewView. 我们选择默认的后置摄像头。

app/src/main/java/com/example/app/MainActivity.kt

package com.example.app

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity()
{
    private val permission: String = Manifest.permission.CAMERA
    private val requestCode: Int = 1

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (ContextCompat.checkSelfPermission(this, permission)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(this, arrayOf(permission), requestCode)
        } else {
            displayCameraPreview()
        }
    }

    private fun displayCameraPreview()
    {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

        cameraProviderFuture.addListener(Runnable {
            val cameraProvider = cameraProviderFuture.get()

            val preview = Preview.Builder().build()
            preview.setSurfaceProvider(myPreviewView.createSurfaceProvider())

            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            cameraProvider.bindToLifecycle(this, cameraSelector, preview)
        }, ContextCompat.getMainExecutor(this))
    }
}

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论