Android Camera App启动流程解析
前言:做了7年的camera app开发,给自己一个总结,算是对camera的一次告白吧。Camera被大家誉为手机的眼睛,是现在各大手机厂商的卖点,也是各大厂商重点发力的地方。Camera的重要性我就不在这里赘述了,让我们进入正题。
先来一张官方的流程图,让我们更加清晰的了解Camera的架构。


一、申请权限
Manifest.permission.CAMERA
如果只要拍照功能,不需要录像的功能,只申请Camera的权限就可以了。
参考代码:参考Camera2 原码
Manifest.permission.RECORD_AUDIO
如果camera app中需要有录像的功能
参考代码:参考Camera2 原码
Manifest.permission.ACCESS_COARSE_LOCATION
Manifest.permission.ACCESS_FINE_LOCATION
如果需要拍照生成的照片带gps的信息,需要申请这两个权限。
参考代码:参考Camera2 原码
二、准备SurfaceView或者SurfaceTexture 或 TextureView
在Camera app启动的时候,onCreate的时候创建surface,可以选择SurfaceView或者SurfaceTexture,这里是根据业务选择的,各有优缺点。
- SurfaceView:SurfaceView的核心在于提供了两个线程:UI线程和渲染线程,两个线程通过“双缓冲”机制来达到高效的界面刷新效果。
- SurfaceTexture: 和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,因此可用于图像流数据的二次处理(如Camera滤镜,桌面特效等)。比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。
- TextureView: 它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。
- SurfaceView和TextureView对比:

参考代码:Camera2 代码中用的是SurefaceTexture
三、准备打开camera和预览
Surface准备好了,收到onSurfaceTextureAvailable后,app就可以打开camera和预览了。
参考代码:reopenCamera
获取camera id
首先要确定app要打开的是哪个Camera id,把这个id确定好,app就可以通过openCamera来打开正确的camera sensor了。
参见camera2代码:获取cameraid
openCamera
CameraManager调用openCamera方法打开camera,参见api文档:openCamera
对应到Camera2 的原码位置:open —> 真正调用openCamera的位置 -->framework中CameraManager调用openCamera的位置–>openCameraForUid -->openCameraDeviceUserAsync–>connectDevice–>connectHelper–>CameraService.cpp中的方法connectHelper–>[makeClient ]
(http://aospxref.com/android-13.0.0_r3/xref/frameworks/av/services/camera/libcameraservice/CameraService.cpp#940)
1060 if (effectiveApiLevel == API_1) { // Camera1 API route
1061 sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
1062 *client = new Camera2Client(cameraService, tmp, cameraService->mCameraServiceProxyWrapper,
1063 packageName, featureId, cameraId, api1CameraId, facing, sensorOrientation,
1064 clientPid, clientUid, servicePid, overrideForPerfClass, overrideToPortrait,
1065 forceSlowJpegMode);
1066 ALOGI("%s: Camera1 API (legacy), override to portrait %d, forceSlowJpegMode %d",
1067 __FUNCTION__, overrideToPortrait, forceSlowJpegMode);
1068 } else { // Camera2 API route
1069 sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
1070 static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
1071 *client = new CameraDeviceClient(cameraService, tmp,
1072 cameraService->mCameraServiceProxyWrapper, packageName, systemNativeClient,
1073 featureId, cameraId, facing, sensorOrientation, clientPid, clientUid, servicePid,
1074 overrideForPerfClass, overrideToPortrait);
1075 ALOGI("%s: Camera2 API, override to portrait %d", __FUNCTION__, overrideToPortrait);
1076 }
–>调用camera2的CameraDeviceClient -->Camera2ClientBase.
- 从CameraService.cpp 中的connectHelper中调用initialize --> initialize–>initializeImpl–>CameraDeviceClient.cpp中的方法 initialize --> initializeImpl --> Camera2ClientBase.cpp initialize --> initializeImpl --> 创建Camera3Device
switch (providerTransport) {
116 case IPCTransport::HIDL:
117 mDevice =
118 new HidlCamera3Device(TClientBase::mCameraIdStr, mOverrideForPerfClass,
119 mLegacyClient);
120 break;
121 case IPCTransport::AIDL:
122 mDevice =
123 new AidlCamera3Device(TClientBase::mCameraIdStr, mOverrideForPerfClass,
124 mLegacyClient);
125 break;
126 default:
127 ALOGE("%s Invalid transport for camera id %s", __FUNCTION__,
128 TClientBase::mCameraIdStr.string());
129 return NO_INIT;
130 }
–>Camera2ClientBase.cpp 中的方法 initialize --> HidlCamera3Device.cpp 中的方法initialize -->
openHidlSession -->
相关文章:
Android Camera App启动流程解析
前言:做了7年的camera app开发,给自己一个总结,算是对camera的一次告白吧。Camera被大家誉为手机的眼睛,是现在各大手机厂商的卖点,也是各大厂商重点发力的地方。Camera的重要性我就不在这里赘述了,让我们进…...
[工业自动化-8]:西门子S7-15xxx编程 - PLC主站 - CPU模块
目录 前言: 一、概述 二、CPU操作和显示 三、安装 四、CPU的选择 前言: 一、概述 西门子S7-1500系列是一系列高性能工业自动化控制器,广泛应用于制造业、自动化生产、物流等领域。这个系列的控制器是设计用来满足高性能、高效能要求的复…...
QT事件循环和事件队列的理解
Qt的事件循环机制_qt事件循环流程-CSDN博客 QT-事件循环机制_qt线程事件循环-CSDN博客 一、事件处理流程如图所示: 1.QCoreApplication::postEvent(QObject *receiver,QEvent *event): QCoreApplication::postEvent()函数用于将事件异步地发送到目标对…...
【Android】画面卡顿优化列表流畅度一
卡顿渲染耗时如图: 卡顿表现有如下几个方面: 网络图片渲染耗时大上下滑动反应慢,甚至画面不动新增一页数据加载渲染时耗时比较大,上下滑动几乎没有反应,画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…...
SNP应邀参加2023中国企业数字化转型峰会暨赛意用户大会
创新驱动科技,数智驱动未来。如今,我国产业数字化进程提速升级,数字产业化规模持续壮大。数据显示,2022年,我国数字经济规模达50.2万亿元,总量稳居世界第二。数字经济已经成为推动传统产业转型升级、促进高…...
黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理
文章目录 由来:接口文档第一代:Swagger第二代:Knife4j界面 由来:接口文档 古老编程是一个语言前后端通吃,ASP、JSP、PHP都是如此。 但随着项目规模变大,项目团队也开始壮大,岗位职责开始细分&a…...
PHP安全问题:远程溢出、DoS、safe_mode绕过漏洞
一、Web 服务器安全 PHP 其实不过是 Web服务器的一个模块功能,所以首先要保证 Web服务器的安全。当 然 Web服务器要安全又必须是先保证系统安全,这样就扯远了, 无穷无尽。PHP可以和各种 Web 服务器结合,这里也只讨论 Apache。非常建议以 chroot 方式安装启动 Apache,这样…...
2023云计算发展
未来的云计算世界将是一个充满着无限可能和创意的世界。在这个世界中,人们可以通过云计算技术实现更加便捷、安全、高效的日常生活,同时可以探索更加广阔、神奇的世界。 智能家居将成为云计算的新宠。未来,人们可以通过语音、手势、传感器等…...
javaSE学习笔记(六)泛型,异常
五、泛型 泛型的由来:通过Object转型问题引入--为了解决安全隐患 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换异常的问题 泛型作用 提高安全性(将运行期的错误转换到编译期) 省去强转的麻烦,取…...
C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发006:基于redis查找玩家姓名+游戏业务实现总结
文章目录 1 Redis的安装与API的使用1.1 安装目录及环境变量1.2 设置远程客户端连接和守护进程1.3 启动redis1.4 Hiredis API的使用1.5 我的动态库和头文件 2 Redis的使用2.1 初始化时候2.2 结束的时候 3 测试4 Makefile5 游戏业务总结 1 Redis的安装与API的使用 1.1 安装目录及…...
数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台
数字孪生,是一种利用物理模型、传感器数据、运行历史等信息,在虚拟空间中构建实体对象或系统的精确映射,从而实现对其全生命周期的仿真、优化和管理的技术。数字孪生可以应用于各个领域,如工业制造、智慧城市、医疗健康、教育培训…...
react之Component存在的2个问题
问题 只要执行setState(),即使不改变状态数据,组件也会重新render()只当前组件重新render(),就会自动重新render子组件 原因 Component中的shouldComponentUpdate()总是返回true 思路 只有当组件的state或props数据发生改变时才重新rend…...
【论文阅读】Generating Radiology Reports via Memory-driven Transformer (EMNLP 2020)
资料链接 论文原文:https://arxiv.org/pdf/2010.16056v2.pdf 代码链接(含数据集):https://github.com/cuhksz-nlp/R2Gen/ 背景与动机 这篇文章的标题是“Generating Radiology Reports via Memory-driven Transformer”…...
IP协议相关技术
文章目录 IP协议相关技术仅凭IP无法完成通信DNSARP IP协议相关技术 仅凭IP无法完成通信 人们在上网的时候其实很少直接输入某个具体的IP地址。 在访问Web站点和发送、接收电子邮件时,我们通常会直接输入Web网站的地址或电子邮件地址等那些由应用层提供的地址&…...
Visual Studio2022安装教程【图文详解】(大一小白)编译软件
工欲善其事,必先利其器。想要学好编程,首先要把手中的工具利用好,今天小编教一下大家如何下载安装并使用史上最强大的编译器--Visual Studio🍗 一.Visual Studio下载及安装 https://visualstudio.microsoft.com/ 打开文件 点击.ex…...
matlab 点云最小二乘拟合平面(PCA法)
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 见:matlab 点云最小二乘拟合平面(PCA法详细过程版)。 二、代码实现 clc;clear; %% --------...
socks5代理和https代理有什么不同?各自有哪些优点?
socks5代理和https代理是两种不同的代理服务,它们在实现方式、安全性和协议特点等方面存在差异。下面我们来详细了解一下这两种代理的优点。 一、socks5代理的优点 1. 速度快 socks5代理采用了TCP协议,能够有效地减少网络延迟和数据传输速度慢的问题&…...
springboot,spring框架返回204 status code的时候,会吞掉返回值
背景 发现有个有意思的现象,就是当你的接口返回204的 HTTP status code 的时候,会自动把 response body 吃掉,即使代码里是有返回的。例如 (其实204本身就是NO_CONTENT的意思,不过我是真没想到真干掉了返回࿰…...
6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件
1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据 2 配置文件 3 整站爬取博客–》爬取详情–》数据传递 scrapy 爬虫框架补充 # 1 打码平台---》破解验证码-数字字母:ddddocr-计算题,滑块,成语。。。-云打码,超…...
idea 一直卡在maven正在解析maven依赖
修改maven Importing的jvm参数 -Xms1024m -Xmx2048m...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
