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...
科技领袖的双面影响:创新与争议的边界
1. 科技领袖的双面影响:创新与争议的边界硅谷钢铁侠的称号背后,是一位不断打破常规的企业家。从PayPal的电子支付革命到SpaceX的太空探索,从特斯拉的电动汽车到Neuralink的脑机接口,这位科技先锋的每一个动作都牵动着全球目光。但…...
科技史上的今天:4月23日
今天是4月23日,在科技发展的长河中,这一天见证了多个里程碑式的时刻,从物理学的奠基到航空工业的突破,再到互联网时代的商业博弈。以下是发生在今天的四件科技大事。 量子力学之父普朗克诞生 1858年的今天,德国物理学…...
从手动点到自动读:Opc Quick Client + 代码片段,快速验证你的OPC DA客户端程序
从手动点到自动读:Opc Quick Client 代码片段,快速验证你的OPC DA客户端程序 在工业自动化系统的开发过程中,数据采集的可靠性往往决定了整个系统的稳定性。作为连接现场设备与上层应用的关键桥梁,OPC DA协议的客户端开发一直是自…...
在openEuler 23.03上,我为什么放弃了直接编辑ifcfg文件,改用nmcli命令配置网卡?
在openEuler 23.03上,我为什么放弃了直接编辑ifcfg文件,改用nmcli命令配置网卡? 凌晨三点,服务器监控突然告警,我的SSH连接毫无征兆地断开。通过控制台查看,发现网络接口莫名其妙地失去了IP配置。这次事故…...
如何用开源工具重新定义游戏存档管理:暗黑破坏神2存档编辑器的技术实践
如何用开源工具重新定义游戏存档管理:暗黑破坏神2存档编辑器的技术实践 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 在数字游戏时代,游戏存档管理一直是玩家和技术爱好者关注的核心问题。特别是对于像…...
基于国家密码管理局发布的商用密码管理条例,国家关键信息基础设施必须采用国产密码算法。在这一政策背景下,国密CPU门禁系统应运而生,成为高安全场所门禁建设的首选方案杜绝NFC普及、卡片复制、射频嗅探泛滥
2026年国密CPU门禁系统技术方案文档信息项目内容文档名称2026年国密CPU门禁系统技术方案版本号DAGM-MJ-SFV1.0编制日期2026年说明资料仅供相互学习,请勿用于商用!第一章 行业背景与市场分析1.1 市场安全需求趋势随着信息技术的快速发展和国家安全战略的深…...
从机械到嵌入式,我靠这3个自学项目拿到了36W的校招Offer(附完整学习路线)
从机械到嵌入式:3个实战项目如何帮我斩获36W年薪Offer 1. 跨专业转型的底层逻辑 机械专业背景的我,最初对嵌入式开发几乎一无所知。但通过系统分析行业需求,我发现嵌入式开发的核心竞争力在于硬件抽象能力和系统思维。与纯软件开发不同&#…...
VR消防安全学习机,数字化消防培训新选择
在城市建设不断加快、公共空间日益复杂的背景下,消防安全教育的重要性愈发凸显。传统的消防宣传多以展板、手册、讲座为主,信息传递单一,参与感不足,难以让体验者真正理解火灾风险与应急处置要点。VR消防安全学习机正是在这样的需…...
Honey Select 2终极增强指南:一站式解决游戏兼容性与功能扩展问题
Honey Select 2终极增强指南:一站式解决游戏兼容性与功能扩展问题 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》游戏体验…...
Modelsim仿真踩坑实录:从vsim-12027到vlog-2889,这些Verilog/SystemVerilog报错到底怎么破?
Modelsim仿真实战避坑指南:高频错误代码解析与修复方案 在数字电路设计验证领域,Modelsim作为业界标准的仿真工具,其报错信息却常常让工程师们抓耳挠腮。那些以"vsim"或"vlog"开头的错误代码,背后隐藏着从语…...
