2024年Android最新Android之 Camera 框架,头条android面试节奏

最后

文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

  • Android进阶学习全套手册
    关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。

  • Android高级架构师进阶知识体系图
    关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Camera 是一个很重要的类,     它与 CameraService 端通过 Binder IPC 机制交互来实现具体功能。

Camera 继承自 BnCameraClient,并最终继承自 ICameraClient。

Camera 类通过:

sp sm = defaultServiceManager();

sp binder = sm->getService(String16(“media.camera”));

sp mCameraService = interface_cast(binder);

得到名字为“media.camera”的 CameraService。通过调用 CameraService 的接口 connect()返

回得到 sp mCamera,并在 CameraService 端 new 一个 CameraService::Client 类

mClient。mClient 继承自 BnCamera,并最终继承自 ICamera。

之 后 Camera 类 通 过 这 个 sp mCamera 对 象 调 用 函 数 就 像 直 接 调 用

CameraService::Client 类 mClient 的函数。CameraService::Client 类实现具体的功能。

service 端

实现在动态库 libcameraservice.so 中,  源代码位于:  frameworks/base/camera/libcameraservice

Libcameraservice.so 中主要有下面两个类:

Libcameraservice.so::CameraService 类 , 继 承 自 BnCameraService , 并 最 终 继 承 自

ICameraService

Libcameraservice.so::CameraService::Client 类, 继承自 BnCamera,    并最终继承自 ICamera

CameraService::Client 类通过调用 Camera HAL 层来实现具体的功能。目前的 code 中只支持

一个 CameraService::Client 实例。

Camera Service 在 系 统 启 动 时 new 了 一 个 实 例 , 以 “ media.camera ” 为 名 字 注 册 到

ServiceManager 中。在 init.rc 中有如下代码执行可执行文件/system/bin/mediaserver,启动多

媒体服务进程。

service media /system/bin/mediaserver

Mediaserver 的 c 代码如下:

int main(int argc,char** argv)

{

sp proc(ProcessState::self());

sp sm = defaultServiceManager();

LOGI(“ServiceManager: %p”,sm。get());

AudioFlinger::instantiate();

MediaPlayerService::instantiate();

CameraService::instantiate();

AudioPolicyService::instantiate();

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

Camera HAL(硬件抽象层)

Libcameraservice.so::CameraService::Client 类调用 camera HAL 的代码实现具体功能,camera

HAL 一般实现为一个动态库 libcamera.so(动态库名字可以改,只需要与 Android.mk 一致即

可)。Android 只给了一个定义文件:

/home/miracle/Work/android/android_src/froyo/frameworks/base/include/camera/CameraHard

wareInterface.h

class CameraHardwareInterface : public virtual RefBase {

public:

virtual ~CameraHardwareInterface() { }

virtual sp getPreviewHeap() const = 0;

virtual sp getRawHeap() const = 0;

virtual void setCallbacks(notify_callback notify_cb,data_callback data_cb,

data_callback_timestamp data_cb_timestamp,void* user) = 0;

virtual void       enableMsgType(int32_t msgType) = 0;

virtual void       disableMsgType(int32_t msgType) = 0;

virtual bool       msgTypeEnabled(int32_t msgType) = 0;

virtual status_t startPreview() = 0;

virtual bool        useOverlay() {return false;}

virtual status_t setOverlay(const sp &overlay) {return BAD_VALUE;}

virtual void         stopPreview() = 0;

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 与

最后

这里我特地整理了一份《Android开发核心知识点笔记》,里面就包含了自定义View相关的内容

除了这份笔记,还给大家分享 Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

分享上面这些资源,希望可以帮助到大家提升进阶,如果你觉得还算有用的话,不妨把它们推荐给你的朋友~

喜欢本文的话,给我点个小赞、评论区留言或者转发支持一下呗~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

外链图片转存中…(img-10oWltSV-1715655383032)]

分享上面这些资源,希望可以帮助到大家提升进阶,如果你觉得还算有用的话,不妨把它们推荐给你的朋友~

喜欢本文的话,给我点个小赞、评论区留言或者转发支持一下呗~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值