跳到主要内容

Android相机API

介绍

Android相机API是Android平台提供的一组接口,允许开发者在应用程序中访问设备的摄像头功能。通过使用这些API,你可以实现拍照、录像、预览等多媒体功能。本文将逐步介绍如何使用Android相机API,并提供代码示例和实际应用场景。

基本概念

在Android中,相机API主要分为两种:

  1. Camera API:这是较旧的API,适用于Android 5.0(API级别21)及更早版本。
  2. CameraX API:这是较新的API,适用于Android 5.0及更高版本,提供了更简单的接口和更好的兼容性。

本文将重点介绍CameraX API,因为它更现代化且易于使用。

设置CameraX

要使用CameraX,首先需要在项目的build.gradle文件中添加依赖项:

groovy
dependencies {
implementation "androidx.camera:camera-core:1.0.0"
implementation "androidx.camera:camera-camera2:1.0.0"
implementation "androidx.camera:camera-lifecycle:1.0.0"
implementation "androidx.camera:camera-view:1.0.0"
}

初始化CameraX

在Activity或Fragment中,你需要初始化CameraX并设置预览视图。以下是一个简单的示例:

kotlin
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner

class CameraActivity : AppCompatActivity() {

private lateinit var previewView: PreviewView

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

previewView = findViewById(R.id.previewView)

startCamera()
}

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

cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

val preview = Preview.Builder().build().also {
it.setSurfaceProvider(previewView.surfaceProvider)
}

val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this as LifecycleOwner, cameraSelector, preview
)
} catch(exc: Exception) {
Log.e("CameraActivity", "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
}

在这个示例中,我们首先获取ProcessCameraProvider的实例,然后设置预览视图并将其绑定到生命周期。这样,相机预览就会显示在PreviewView中。

拍照

要使用CameraX拍照,你可以使用ImageCapture用例。以下是如何配置和使用ImageCapture的示例:

kotlin
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import java.io.File

private var imageCapture: ImageCapture? = null

private fun takePhoto() {
val imageCapture = imageCapture ?: return

val photoFile = File(externalMediaDirs.firstOrNull(), "${System.currentTimeMillis()}.jpg")

val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

imageCapture.takePicture(
outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val msg = "Photo saved: ${photoFile.absolutePath}"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
}

override fun onError(exc: ImageCaptureException) {
Log.e("CameraActivity", "Photo capture failed: ${exc.message}", exc)
}
}
)
}

在这个示例中,我们创建了一个ImageCapture实例,并使用它来拍摄照片。照片保存到设备的存储中,并在保存成功后显示一条消息。

录像

要使用CameraX录像,你可以使用VideoCapture用例。以下是如何配置和使用VideoCapture的示例:

kotlin
import androidx.camera.core.VideoCapture
import androidx.camera.core.VideoCaptureException
import java.io.File

private var videoCapture: VideoCapture? = null

private fun startRecording() {
val videoCapture = videoCapture ?: return

val videoFile = File(externalMediaDirs.firstOrNull(), "${System.currentTimeMillis()}.mp4")

val outputOptions = VideoCapture.OutputFileOptions.Builder(videoFile).build()

videoCapture.startRecording(
outputOptions, ContextCompat.getMainExecutor(this), object : VideoCapture.OnVideoSavedCallback {
override fun onVideoSaved(output: VideoCapture.OutputFileResults) {
val msg = "Video saved: ${videoFile.absolutePath}"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
}

override fun onError(videoCaptureError: Int, message: String, cause: VideoCaptureException?) {
Log.e("CameraActivity", "Video capture failed: $message", cause)
}
}
)
}

private fun stopRecording() {
videoCapture?.stopRecording()
}

在这个示例中,我们创建了一个VideoCapture实例,并使用它来开始录像。录像保存到设备的存储中,并在保存成功后显示一条消息。

实际应用场景

Android相机API在许多实际应用场景中都非常有用,例如:

  • 社交媒体应用:允许用户拍摄照片或视频并分享到社交媒体平台。
  • 文档扫描应用:使用相机拍摄文档并进行图像处理以生成PDF文件。
  • 增强现实应用:结合相机和传感器数据,实现增强现实效果。

总结

通过本文,你学习了如何使用Android相机API在应用程序中实现拍照和录像功能。我们介绍了CameraX API的基本概念,并提供了代码示例和实际应用场景。希望这些内容能帮助你更好地理解和使用Android相机API。

附加资源

练习

  1. 修改示例代码,使其支持切换前后摄像头。
  2. 尝试在拍照或录像时添加水印或滤镜效果。
  3. 实现一个简单的文档扫描应用,使用相机拍摄文档并保存为PDF文件。