Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)

发布于:2025-08-09 ⋅ 阅读:(10) ⋅ 点赞:(0)

Android Studio 版本号:2024.1.2

CameraX是Jetpack系列中的一个库,它基于Camera2 API构建,但提供了更高层次的抽象。

CameraX 三大核心用例: Preview预览 ,ImageCapture拍照和 VideoCapture录视频

一、创建项目,进行环境配置

CameraX 需要一些属于 Java 8 的方法,因此我们需要相应地设置编译选项。在 android 代码块的末尾,紧跟在 buildTypes 之后,有以下配置:

使用 ViewBinding,因此请使用以下代码(在 android{} 代码块末尾)启用它:

buildFeatures {
   viewBinding = true
}

 CameraXApp.app 模块的build.gradle文件中添加CameraX依赖

   // CameraX 核心库
    val cameraVersion = "1.3.0"
    implementation("androidx.camera:camera-core:${cameraVersion}")
    implementation("androidx.camera:camera-camera2:${cameraVersion}")

    // 如果需要使用生命周期集成
    implementation("androidx.camera:camera-lifecycle:${cameraVersion}")

    // 如果需要视图组件 (PreviewView)
    implementation("androidx.camera:camera-view:${cameraVersion}")

    // 视频录制专用库
    implementation("androidx.camera:camera-video:${cameraVersion}")

    // 如果需要扩展功能 (如 HDR、夜间模式等)
    implementation("androidx.camera:camera-extensions:${cameraVersion}")

 因为用到了ConstraintLayout布局,所以也要引入依赖

implementation("androidx.constraintlayout:constraintlayout:2.1.4")

最后点击 Sync Now,我们就可以在应用中使用 CameraX 了

 二、创建界面布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

    <Button
        android:id="@+id/image_take_photo_button"
        android:layout_width="110dp"
        android:layout_height="110dp"
        android:layout_marginBottom="50dp"
        android:layout_marginEnd="50dp"
        android:elevation="2dp"
        android:text="拍照"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintEnd_toStartOf="@id/vertical_centerline" />

    <Button
        android:id="@+id/video_record_button"
        android:layout_width="110dp"
        android:layout_height="110dp"
        android:layout_marginBottom="50dp"
        android:layout_marginStart="50dp"
        android:elevation="2dp"
        android:text="录视频"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@id/vertical_centerline" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/vertical_centerline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent=".50" />

</androidx.constraintlayout.widget.ConstraintLayout>

三、在AndroidManifest.xml中添加权限声明

<!--    确保设备配有相机,指定 .any 表示它可以是前置摄像头,也可以是后置摄像头-->
<!--    如果您在未指定 .any 的情况下使用 android.hardware.camera,并且您的设备未配有后置摄像头,那么相机将无法正常运行-->
    <uses-feature android:name="android.hardware.camera.any" />
<!--    添加对该相机的使用权限-->
    <uses-permission android:name="android.permission.CAMERA" />
<!--    录制音频也需要麦克风权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--    存储空间写入权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="28" />

四、代码中动态申请权限

import android.os.Bundle
import androidx.activity.ComponentActivity
import com.dcy.cameraxapp.databinding.ActivityMainBinding
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : ComponentActivity() {
    private lateinit var viewBinding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)
        //请求相机权限
        if (allPermissionsGranted()) {
            startCamera()
        } else {
            ActivityCompat.requestPermissions(
                this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
        }
    }
    private fun startCamera() {}

    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(
            baseContext, it) == PackageManager.PERMISSION_GRANTED
    }
    override fun onDestroy() {
        super.onDestroy()
    }
    companion object {
        private const val TAG = "CameraXApp"
        private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
        private con

网站公告

今日签到

点亮在社区的每一天
去签到