阿里巴巴p7面试经验,Android之 Camera 框架,了解Android架构组件后构建APP超简单

virtual bool         previewEnabled() = 0;

virtual status_t      startRecording() = 0;

virtual bool         recordingEnabled() = 0;

virtual status_t      autoFocus() = 0;

virtual status_t      cancelAutoFocus() = 0;

virtual status_t      takePicture() = 0;

virtual status_t      cancelPicture() = 0;

virtual status_t      setParameters(const CameraParameters& params) = 0;

virtual CameraParameters getParameters() const = 0;

virtual status_t sendCommand(int32_t cmd,int32_t arg1,int32_t arg2) = 0;

virtual void release() = 0;

virtual status_t dump(int fd,const Vector& args) const = 0;

};

extern “C” sp openCameraHardware();

}; // namespace android

可以看到在 JAVA Ap 中的功能调用最终会调用到 HAL 层这里,Camera HAL 层的实现是主要

的工作,      它一般通过 V4L2 command 从 linux kernel 中的 camera driver 得到 preview 数据。然

后交给 surface(overlay)显示或者保存为文件。在 HAL 层需要打开对应的设备文件,并通过

ioctrl 访问 camera driver。Android 通过这个 HAL 层来保证底层硬件(驱动)改变,只需修改

对应的 HAL 层代码,FrameWork 层与 JAVA Ap 的都不用改变。

Preview 数据流程

Android 框架中 preview 数据的显示过程如下:

1、 打开内核设备文件。CameraHardwareInterface.h 中定义的 openCameraHardware()打开

linux kernel 中的 camera driver 的设备文件(如/dev/video0)      ,创建初始化一些相关的类

的实例。

2、 设置摄像头的工作参数。CameraHardwareInterface.h 中定义的 setParameters()函数,在

这一步可以通过参数告诉 camera HAL 使用哪一个硬件摄像头,  以及它工作的参数  (size,

format 等) ,并在 HAL 层分配存储 preview 数据的 buffers(如果 buffers 是在 linux kernel

中的 camera driver 中分配的,在这一步也会拿到这些 buffers mmap 后的地址指针)                      。

3、 设置显示目标。需在 JAVA APP 中创建一个 surface 然后传递到 CameraService 中。会调

用到 libcameraservice.so 中的 setPreviewDisplay(const sp& surface)函数中。在

这里分两种情况考虑:一种是不使用 overlay;一种是使用 overlay 显示。如果不使用

overlay 那设置显示目标最后就在 libcameraservice.so 中,不会进 Camera HAL 动态库。

并将上一步拿到的 preview 数据 buffers 地址注册到 surface 中。 如果使用 overlay 那在

libcameraservice.so 中会通过传进来的 Isurface 创建 Overlay 类的实例,然后调用

CameraHardwareInterface.h 中定义的 setOverlay()设置到 Camera HAL 动态库中。

4、 开始 preview 工作。最终调用到 CameraHardwareInterface.h 中定义的 startPreview()函数。

如果不使用 overlay,Camera HAL 得到 linux kernel 中的 preview 数据后回调通知到

libcameraservice.so 中。在 libcameraservice.so 中会使用上一步的 surface 进行显示。如

果使用 overlay,    Camera HAL 得到 linux kernel 中的 preview 数据后直接交给 Overlay 对象,

然后有 Overlay HAL 去显示。

模拟器中的虚拟 camera

如果没有 camera 硬件,不实现真正的 Camera HAL 动态库,可以使用虚拟 camera。源代码

位于:

frameworks/base/camera/libcameraservice/FakeCamera.cpp

frameworks/base/camera/libcameraservice/CameraHardwareStub.cpp

FakeCamera.cpp 文件提供虚拟的 preview 数据。CameraHardwareStub.cpp 文件中实现了

camera HAL(硬件抽象层)的功能。当宏 USE_CAMERA_STUB 为 true 时可以使用这个虚拟的

camera。

ifeq ($(USE_CAMERA_STUB),true)

LOCAL_STATIC_LIBRARIES += libcamerastub //虚拟的 camera

#if want show LOGV message,should use follow define。 add 0929

#LOCAL_CFLAGS += -DLOG_NDEBUG=0

LOCAL_CFLAGS += -include CameraHardwareStub。h

else

LOCAL_SHARED_LIBRARIES += libcamera //真正的 camera HAL 库

endif

框架图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Overlay 简单介绍

overlay 一般用在 camera preview,视频播放等需要高帧率的地方,还有可能 UI 界面设计

的需求, 如map 地图查看软件需两层显示信息。 overlay 需要硬件与驱动的支持。  Overlay 没

有 java 层的 code,也就没有 JNI 调用。一般都在 native 中使用。

Overlay 的使用方法

1. 头文件

overlay object 对外的接口

#include <ui/Overlay。h>

下面三个用于从 HAL 得到 overlay object

#include <surfaceflinger/Surface。h>

#include <surfaceflinger/ISurface。h>

#include <surfaceflinger/SurfaceComposerClient。h>

2.  相关动态库文件

libui.so

libsurfaceflinger_client.so

3.  调用步骤

创建 surfaceflinger 的客户端

sp client = new SurfaceComposerClient();

创建推模式 surface

sp surface = client->createSurface(getpid(),0,320,240,

PIXEL_FORMAT_UNKNOWN,IsurfaceComposer::ePushBuffers);

获得 surface 接口

sp isurface = surface->getISurface();

获得 overlay 设备

sp ref = isurface->createOverlay(320,240,PIXEL_FORMAT_RGB_565);

这里会通过调用 overlay hal 层的 createoverlay()打开对应的设备文件。

创建 overlay 对象

sp overlay = new Overlay(ref);

使用 overlay API

overlay_buffer_t buffer; //typedef void* overlay_buffer_t;

void* address = overlay->getBufferAddress(buffer);

address 指针就是 mmap 后的 overlay buffer 指针,   只需将数据填充到这个 address 指针就可

以看到画面了。

Android overlay 框架

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

overlay 本地框架代码

源代码位于:frameworks/base/libs/ui/ ,编译到 libui.so 中。

Overlay.cpp : 提 供 给 外 部 程 序 调 用 的 Overlay object 接 口 与 API 。 定 义 在

frameworks/base/include/ui/Overlay.h 中。实现了两个类:OverlayRef 与 Overlay。外部

程序通过这个 Overlay 对象来使用 overlay 的功能。Overlay.cpp 内部通过 binder 与

surfaceFlinger service 通信,最终调用到 Overlay HAL。

IOVerlay.cpp:  定义提供 binder 所需的类,        其中 LayerBuffer::OverlaySource::OverlayChannel

继承自 BnOverlay。

overlay 的服务部分代码

源代码位于:frameworks/base/libs/surfaceflinger/

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

*](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值