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

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启动流程解析

前言&#xff1a;做了7年的camera app开发&#xff0c;给自己一个总结&#xff0c;算是对camera的一次告白吧。Camera被大家誉为手机的眼睛&#xff0c;是现在各大手机厂商的卖点&#xff0c;也是各大厂商重点发力的地方。Camera的重要性我就不在这里赘述了&#xff0c;让我们进…...

[工业自动化-8]:西门子S7-15xxx编程 - PLC主站 - CPU模块

目录 前言&#xff1a; 一、概述 二、CPU操作和显示 三、安装 四、CPU的选择 前言&#xff1a; 一、概述 西门子S7-1500系列是一系列高性能工业自动化控制器&#xff0c;广泛应用于制造业、自动化生产、物流等领域。这个系列的控制器是设计用来满足高性能、高效能要求的复…...

QT事件循环和事件队列的理解

Qt的事件循环机制_qt事件循环流程-CSDN博客 QT-事件循环机制_qt线程事件循环-CSDN博客 一、事件处理流程如图所示&#xff1a; 1.QCoreApplication::postEvent(QObject *receiver,QEvent *event)&#xff1a; QCoreApplication::postEvent()函数用于将事件异步地发送到目标对…...

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图&#xff1a; 卡顿表现有如下几个方面&#xff1a; 网络图片渲染耗时大上下滑动反应慢&#xff0c;甚至画面不动新增一页数据加载渲染时耗时比较大&#xff0c;上下滑动几乎没有反应&#xff0c;画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…...

SNP应邀参加2023中国企业数字化转型峰会暨赛意用户大会

创新驱动科技&#xff0c;数智驱动未来。如今&#xff0c;我国产业数字化进程提速升级&#xff0c;数字产业化规模持续壮大。数据显示&#xff0c;2022年&#xff0c;我国数字经济规模达50.2万亿元&#xff0c;总量稳居世界第二。数字经济已经成为推动传统产业转型升级、促进高…...

黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理

文章目录 由来&#xff1a;接口文档第一代&#xff1a;Swagger第二代&#xff1a;Knife4j界面 由来&#xff1a;接口文档 古老编程是一个语言前后端通吃&#xff0c;ASP、JSP、PHP都是如此。 但随着项目规模变大&#xff0c;项目团队也开始壮大&#xff0c;岗位职责开始细分&a…...

PHP安全问题:远程溢出、DoS、safe_mode绕过漏洞

一、Web 服务器安全 PHP 其实不过是 Web服务器的一个模块功能,所以首先要保证 Web服务器的安全。当 然 Web服务器要安全又必须是先保证系统安全,这样就扯远了, 无穷无尽。PHP可以和各种 Web 服务器结合,这里也只讨论 Apache。非常建议以 chroot 方式安装启动 Apache,这样…...

2023云计算发展

未来的云计算世界将是一个充满着无限可能和创意的世界。在这个世界中&#xff0c;人们可以通过云计算技术实现更加便捷、安全、高效的日常生活&#xff0c;同时可以探索更加广阔、神奇的世界。 智能家居将成为云计算的新宠。未来&#xff0c;人们可以通过语音、手势、传感器等…...

javaSE学习笔记(六)泛型,异常

五、泛型 泛型的由来&#xff1a;通过Object转型问题引入--为了解决安全隐患 早期的Object类型可以接收任意的对象类型&#xff0c;但是在实际的使用中&#xff0c;会有类型转换异常的问题 泛型作用 提高安全性(将运行期的错误转换到编译期) 省去强转的麻烦&#xff0c;取…...

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实时云渲染助推上海湾区数字孪生平台

数字孪生&#xff0c;是一种利用物理模型、传感器数据、运行历史等信息&#xff0c;在虚拟空间中构建实体对象或系统的精确映射&#xff0c;从而实现对其全生命周期的仿真、优化和管理的技术。数字孪生可以应用于各个领域&#xff0c;如工业制造、智慧城市、医疗健康、教育培训…...

react之Component存在的2个问题

问题 只要执行setState()&#xff0c;即使不改变状态数据&#xff0c;组件也会重新render()只当前组件重新render()&#xff0c;就会自动重新render子组件 原因 Component中的shouldComponentUpdate()总是返回true 思路 只有当组件的state或props数据发生改变时才重新rend…...

【论文阅读】Generating Radiology Reports via Memory-driven Transformer (EMNLP 2020)

资料链接 论文原文&#xff1a;https://arxiv.org/pdf/2010.16056v2.pdf 代码链接&#xff08;含数据集&#xff09;&#xff1a;https://github.com/cuhksz-nlp/R2Gen/ 背景与动机 这篇文章的标题是“Generating Radiology Reports via Memory-driven Transformer”&#xf…...

IP协议相关技术

文章目录 IP协议相关技术仅凭IP无法完成通信DNSARP IP协议相关技术 仅凭IP无法完成通信 人们在上网的时候其实很少直接输入某个具体的IP地址。 在访问Web站点和发送、接收电子邮件时&#xff0c;我们通常会直接输入Web网站的地址或电子邮件地址等那些由应用层提供的地址&…...

Visual Studio2022安装教程【图文详解】(大一小白)编译软件

工欲善其事&#xff0c;必先利其器。想要学好编程&#xff0c;首先要把手中的工具利用好&#xff0c;今天小编教一下大家如何下载安装并使用史上最强大的编译器--Visual Studio&#x1f357; 一.Visual Studio下载及安装 https://visualstudio.microsoft.com/ 打开文件 点击.ex…...

matlab 点云最小二乘拟合平面(PCA法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 见:matlab 点云最小二乘拟合平面(PCA法详细过程版)。 二、代码实现 clc;clear; %% --------...

socks5代理和https代理有什么不同?各自有哪些优点?

socks5代理和https代理是两种不同的代理服务&#xff0c;它们在实现方式、安全性和协议特点等方面存在差异。下面我们来详细了解一下这两种代理的优点。 一、socks5代理的优点 1. 速度快 socks5代理采用了TCP协议&#xff0c;能够有效地减少网络延迟和数据传输速度慢的问题&…...

springboot,spring框架返回204 status code的时候,会吞掉返回值

背景 发现有个有意思的现象&#xff0c;就是当你的接口返回204的 HTTP status code 的时候&#xff0c;会自动把 response body 吃掉&#xff0c;即使代码里是有返回的。例如 &#xff08;其实204本身就是NO_CONTENT的意思&#xff0c;不过我是真没想到真干掉了返回&#xff0…...

6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件

1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据 2 配置文件 3 整站爬取博客–》爬取详情–》数据传递 scrapy 爬虫框架补充 # 1 打码平台---》破解验证码-数字字母&#xff1a;ddddocr-计算题&#xff0c;滑块&#xff0c;成语。。。-云打码&#xff0c;超…...

idea 一直卡在maven正在解析maven依赖

修改maven Importing的jvm参数 -Xms1024m -Xmx2048m...

科技领袖的双面影响:创新与争议的边界

1. 科技领袖的双面影响&#xff1a;创新与争议的边界硅谷钢铁侠的称号背后&#xff0c;是一位不断打破常规的企业家。从PayPal的电子支付革命到SpaceX的太空探索&#xff0c;从特斯拉的电动汽车到Neuralink的脑机接口&#xff0c;这位科技先锋的每一个动作都牵动着全球目光。但…...

科技史上的今天:4月23日

今天是4月23日&#xff0c;在科技发展的长河中&#xff0c;这一天见证了多个里程碑式的时刻&#xff0c;从物理学的奠基到航空工业的突破&#xff0c;再到互联网时代的商业博弈。以下是发生在今天的四件科技大事。 量子力学之父普朗克诞生 1858年的今天&#xff0c;德国物理学…...

从手动点到自动读:Opc Quick Client + 代码片段,快速验证你的OPC DA客户端程序

从手动点到自动读&#xff1a;Opc Quick Client 代码片段&#xff0c;快速验证你的OPC DA客户端程序 在工业自动化系统的开发过程中&#xff0c;数据采集的可靠性往往决定了整个系统的稳定性。作为连接现场设备与上层应用的关键桥梁&#xff0c;OPC DA协议的客户端开发一直是自…...

在openEuler 23.03上,我为什么放弃了直接编辑ifcfg文件,改用nmcli命令配置网卡?

在openEuler 23.03上&#xff0c;我为什么放弃了直接编辑ifcfg文件&#xff0c;改用nmcli命令配置网卡&#xff1f; 凌晨三点&#xff0c;服务器监控突然告警&#xff0c;我的SSH连接毫无征兆地断开。通过控制台查看&#xff0c;发现网络接口莫名其妙地失去了IP配置。这次事故…...

如何用开源工具重新定义游戏存档管理:暗黑破坏神2存档编辑器的技术实践

如何用开源工具重新定义游戏存档管理&#xff1a;暗黑破坏神2存档编辑器的技术实践 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 在数字游戏时代&#xff0c;游戏存档管理一直是玩家和技术爱好者关注的核心问题。特别是对于像…...

基于国家密码管理局发布的商用密码管理条例,国家关键信息基础设施必须采用国产密码算法。在这一政策背景下,国密CPU门禁系统应运而生,成为高安全场所门禁建设的首选方案杜绝NFC普及、卡片复制、射频嗅探泛滥

2026年国密CPU门禁系统技术方案文档信息项目内容文档名称2026年国密CPU门禁系统技术方案版本号DAGM-MJ-SFV1.0编制日期2026年说明资料仅供相互学习&#xff0c;请勿用于商用&#xff01;第一章 行业背景与市场分析1.1 市场安全需求趋势随着信息技术的快速发展和国家安全战略的深…...

从机械到嵌入式,我靠这3个自学项目拿到了36W的校招Offer(附完整学习路线)

从机械到嵌入式&#xff1a;3个实战项目如何帮我斩获36W年薪Offer 1. 跨专业转型的底层逻辑 机械专业背景的我&#xff0c;最初对嵌入式开发几乎一无所知。但通过系统分析行业需求&#xff0c;我发现嵌入式开发的核心竞争力在于硬件抽象能力和系统思维。与纯软件开发不同&#…...

VR消防安全学习机,数字化消防培训新选择

在城市建设不断加快、公共空间日益复杂的背景下&#xff0c;消防安全教育的重要性愈发凸显。传统的消防宣传多以展板、手册、讲座为主&#xff0c;信息传递单一&#xff0c;参与感不足&#xff0c;难以让体验者真正理解火灾风险与应急处置要点。VR消防安全学习机正是在这样的需…...

Honey Select 2终极增强指南:一站式解决游戏兼容性与功能扩展问题

Honey Select 2终极增强指南&#xff1a;一站式解决游戏兼容性与功能扩展问题 【免费下载链接】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仿真实战避坑指南&#xff1a;高频错误代码解析与修复方案 在数字电路设计验证领域&#xff0c;Modelsim作为业界标准的仿真工具&#xff0c;其报错信息却常常让工程师们抓耳挠腮。那些以"vsim"或"vlog"开头的错误代码&#xff0c;背后隐藏着从语…...