Android Camera Framework:从基础到高级

目录

    • 基础知识
      • [1. Camera API 与 Camera2 API](#1. Camera API 与 Camera2 API)
      • [2. 权限](#2. 权限)
    • 关键组件
      • [1. CameraManager](#1. CameraManager)
      • [2. CameraDevice](#2. CameraDevice)
      • [3. CaptureRequest 和 CaptureSession](#3. CaptureRequest 和 CaptureSession)
    • 高级功能
      • [1. 实时滤镜](#1. 实时滤镜)
      • [2. 手动控制](#2. 手动控制)
      • [3. 高动态范围 (HDR) 和夜间模式](#3. 高动态范围 (HDR) 和夜间模式)

在现代移动应用开发中,相机功能已成为许多应用程序的核心组成部分。Android 提供了一个强大的相机框架,允许开发者轻松集成相机功能到他们的应用中。本文将深入探讨 Android Camera Framework 的基础知识、关键组件以及高级功能,帮助开发者充分利用 Android 相机的潜力。

基础知识

1. Camera API 与 Camera2 API

Android 提供了两个主要的相机 API:

  • Camera API (android.hardware.Camera):这是旧版的相机 API,适用于 Android 5.0(API 级别 21)之前的设备。
  • Camera2 API (android.hardware.camera2):这是新版的相机 API,适用于 Android 5.0 及更高版本的设备。Camera2 API 提供了更细粒度的控制和更丰富的功能。

2. 权限

在使用相机功能之前,需要在 AndroidManifest.xml 文件中声明相机权限:

xml 复制代码
<uses-permission android:name="android.permission.CAMERA" />

对于运行时权限,需要在代码中动态请求:

java 复制代码
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}

关键组件

1. CameraManager

CameraManager 是 Camera2 API 的入口点,用于枚举、打开和管理相机设备。

java 复制代码
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    String[] cameraIds = cameraManager.getCameraIdList();
    for (String cameraId : cameraIds) {
        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
        // 处理相机特性
    }
} catch (CameraAccessException e) {
    e.printStackTrace();
}

2. CameraDevice

CameraDevice 代表一个物理相机设备,可以通过 CameraManager 打开。

java 复制代码
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice cameraDevice) {
        // 相机设备已打开
    }

    @Override
    public void onDisconnected(@NonNull CameraDevice cameraDevice) {
        // 相机设备已断开连接
    }

    @Override
    public void onError(@NonNull CameraDevice cameraDevice, int error) {
        // 相机设备发生错误
    }
}, null);

3. CaptureRequest 和 CaptureSession

CaptureRequest 定义了相机的配置和捕获参数,CaptureSession 用于管理捕获会话。

java 复制代码
CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);

cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        try {
            session.setRepeatingRequest(captureRequestBuilder.build(), null, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
        // 配置失败
    }
}, null);

高级功能

1. 实时滤镜

通过自定义 SurfaceTextureGLSurfaceView,可以实现实时滤镜效果。

java 复制代码
SurfaceTexture surfaceTexture = new SurfaceTexture(0);
surfaceTexture.setDefaultBufferSize(width, height);
Surface surface = new Surface(surfaceTexture);

// 在 GLSurfaceView.Renderer 中处理滤镜效果

2. 手动控制

Camera2 API 允许开发者手动控制曝光、对焦和白平衡等参数。

java 复制代码
captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTime);
captureRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, sensitivity);

3. 高动态范围 (HDR) 和夜间模式

通过组合多个曝光捕获,可以实现 HDR 和夜间模式效果。

java 复制代码
List<CaptureRequest> captureRequests = new ArrayList<>();
for (int i = 0; i < numExposures; i++) {
    captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTimes[i]);
    captureRequests.add(captureRequestBuilder.build());
}

session.captureBurst(captureRequests, new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        // 处理捕获结果
    }
}, null);
相关推荐
龚礼鹏6 分钟前
android 图像显示框架二——流程分析
android
消失的旧时光-194312 分钟前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门1 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白2 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine3 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc11400756635 小时前
Linux1023 mysql 修改密码等
android·mysql·adb
GOATLong6 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql
onthewaying7 小时前
Android SurfaceTexture 深度解析
android·opengl
茄子凉心7 小时前
Android Bluetooth 蓝牙通信
android·蓝牙通信·bluetooth通信
00后程序员张8 小时前
iOS 26 App 运行状况全面解析 多工具协同监控与调试实战指南
android·ios·小程序·https·uni-app·iphone·webview