当前位置: 首页 > news >正文

Android Camera Framework:从基础到高级

目录

    • 基础知识
      • 1. Camera API 与 Camera2 API
      • 2. 权限
    • 关键组件
      • 1. CameraManager
      • 2. CameraDevice
      • 3. CaptureRequest 和 CaptureSession
    • 高级功能
      • 1. 实时滤镜
      • 2. 手动控制
      • 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 文件中声明相机权限:

<uses-permission android:name="android.permission.CAMERA" />

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

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 的入口点,用于枚举、打开和管理相机设备。

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 打开。

cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull CameraDevice cameraDevice) {// 相机设备已打开}@Overridepublic void onDisconnected(@NonNull CameraDevice cameraDevice) {// 相机设备已断开连接}@Overridepublic void onError(@NonNull CameraDevice cameraDevice, int error) {// 相机设备发生错误}
}, null);

3. CaptureRequest 和 CaptureSession

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

CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {try {session.setRepeatingRequest(captureRequestBuilder.build(), null, null);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {// 配置失败}
}, null);

高级功能

1. 实时滤镜

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

SurfaceTexture surfaceTexture = new SurfaceTexture(0);
surfaceTexture.setDefaultBufferSize(width, height);
Surface surface = new Surface(surfaceTexture);// 在 GLSurfaceView.Renderer 中处理滤镜效果

2. 手动控制

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

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 和夜间模式效果。

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() {@Overridepublic void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {// 处理捕获结果}
}, null);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3+springboot+mybatis+mysql项目实践--简单登录注册功能实现
  • seaweedfs + TiKV 部署保姆级教程
  • C语言文件操作技术详解
  • React组件间通信的几种方式
  • Spring相关的面试题
  • vue3中使用 tilwindcss报错 Unknown at rule @tailwindcss
  • QT之嵌入外部第三方软件到本窗体中
  • Java面试八股之Redis有哪些数据类型?底层实现分别是什么
  • 基于ssm的图书管理系统的设计与实现
  • jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar
  • 部署大语言模型并对话
  • Docker 安装字体文件
  • 暑假第一次作业
  • wps 将列的内容转换为一个单元格内容,并以逗号分隔
  • python编程实例 计算字符串中空格、英文、数字、其它字符的数量 两种方式实现
  • 【笔记】你不知道的JS读书笔记——Promise
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android Volley源码解析
  • Debian下无root权限使用Python访问Oracle
  • miaov-React 最佳入门
  • React Native移动开发实战-3-实现页面间的数据传递
  • swift基础之_对象 实例方法 对象方法。
  • vue-router的history模式发布配置
  • 半理解系列--Promise的进化史
  • 入门到放弃node系列之Hello Word篇
  • 一份游戏开发学习路线
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (10)STL算法之搜索(二) 二分查找
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (黑马C++)L06 重载与继承
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)memcache、redis缓存
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET WPF 抖动动画
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 通过系统影子账户实现权限维持
  • .NET中两种OCR方式对比
  • :=
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Mapper作用
  • @RestController注解的使用
  • @SuppressWarnings注解
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BFS广搜]迷阵
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C++] 模拟实现list(二)
  • [C++]18:set和map的使用
  • [C++]打开新世界的大门之C++入门
  • [c++刷题]贪心算法.N01