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.ConstraintLayoutxmlns: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.PreviewViewandroid:id="@+id/myCameraView"android:layout_width="match_parent"android:layout_height="match_parent" /><Buttonandroid: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" /><Buttonandroid: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.Guidelineandroid: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.ContextCompatclass MainActivity : ComponentActivity() {private lateinit var viewBinding: ActivityMainBindingoverride 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