Skip to content

启动相机的方法

1. Camera1 API

Camera1 API 是安卓早期的相机接口,尽管它在新版本的 Android 中已被弃用,但它仍然被一些旧设备和应用所使用。

打开相机的步骤:

  1. 获取 Camera 实例

    • 作用:通过 Camera.open() 打开相机硬件。
    • 代码Camera camera = Camera.open();
  2. 设置相机预览

    • 作用:将相机输出的图像数据显示到 SurfaceViewTextureView 上。
    • 代码camera.setPreviewDisplay(surfaceHolder);
  3. 启动预览

    • 作用:开始相机的实时预览。
    • 代码camera.startPreview();
  4. 释放相机资源

    • 作用:停止预览并释放相机资源。
    • 代码camera.stopPreview();camera.release();

简洁总结:

  1. 获取相机实例Camera.open() 打开相机。
  2. 设置预览显示setPreviewDisplay() 将预览显示到 SurfaceView
  3. 开始预览startPreview() 启动相机预览。
  4. 释放相机资源stopPreview()release() 释放资源。

2. CameraX API

CameraX API 是 Google 提供的一个相机库,它是基于 Camera2 API 构建的,旨在简化相机开发,提供一致性和更好的兼容性,特别是在不同设备和 Android 版本上。

打开相机的步骤:

  1. 添加依赖项

    • 作用:首先,需要在项目中添加 CameraX 的依赖项。
    • 代码build.gradle):
      gradle
      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"
      }
  2. 初始化 CameraX 配置

    • 作用:配置 CameraX 并选择相机的用例(如预览、图片捕获等)。
    • 代码
      kotlin
      val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
      cameraProviderFuture.addListener({
          val cameraProvider = cameraProviderFuture.get()
          val preview = Preview.Builder().build()
          val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
      }, ContextCompat.getMainExecutor(context))
  3. 绑定生命周期

    • 作用:将相机与生命周期绑定,确保相机资源在生命周期结束时自动释放。
    • 代码
      kotlin
      cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)
  4. 显示相机预览

    • 作用:通过 Preview 用例将相机预览显示到 PreviewView
    • 代码
      kotlin
      preview.setSurfaceProvider(previewView.createSurfaceProvider())
  5. 释放相机资源

    • 作用CameraX 会自动管理相机资源,通常无需手动释放,但可以在 onPause() 等生命周期方法中进行一些清理工作。

3. Camera2 API

1. 初始化 CameraManager

  • 作用:获取系统的相机管理器,用于管理和访问设备的相机。
  • 代码mCameraManager = getSystemService(CAMERA_SERVICE) as CameraManager

2. 选择相机 ID

  • 作用:通过 CameraManager 获取所有可用的相机 ID,选择一个相机(例如后置摄像头)。
  • 代码val cameraId = mCameraManager.cameraIdList[0]

3. 打开相机

  • 作用:使用 CameraManager.openCamera() 方法打开选择的相机,并创建一个 CameraDevice 实例,开始相机的操作。
  • 代码mCameraManager.openCamera(cameraId, stateCallback, handler)

4. 创建预览会话

  • 作用:在相机打开后,使用 CameraDevice.createCaptureSession() 创建一个预览会话,将 SurfaceView 显示内容与相机预览绑定。
  • 代码camera.createCaptureSession(listOf(surface), stateCallback, handler)

5. 启动预览

  • 作用:配置相机的预览请求并开始显示相机内容。
  • 代码mCaptureSession.setRepeatingRequest(previewRequest, null, mBackgroundHandler)

6. 释放相机

  • 作用:在不需要相机时,释放相机资源,关闭会话,释放硬件资源。
  • 代码mCameraDevice.close()

简洁总结:

  1. 初始化管理器:获取 CameraManager
  2. 选择相机:选择需要的相机(前置/后置)。
  3. 打开相机:打开相机并获取 CameraDevice
  4. 创建会话:创建相机预览会话并绑定到 SurfaceView
  5. 启动预览:开始相机预览。
  6. 释放资源:停止预览并释放相机资源。

Released under the MIT License.