完整讲解了android中camera的工作机制,代码分析。对了解整个android工作流程会有很大的帮助。
从Camera的整体结构上,类Camera是整个系统核心,ICamera类提供了Camera主要功能的接口,
在客户端方面调用,CameraService是Camera服务,它通过调用实际的Camera硬件接口来实现功能。事实上,图中红色虚线框的部分都是Camera程序的框架部分,它主要利用了Android的系统的Binder机制来完成通讯。蓝色的部分通过调用Camera硬件相关的接口完成具体的Camera服务功能,其它的部分是为上层的JAVA程序提供JNI接口。在整体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过Android的Bimder来实现进程间的通讯。2.2头文件ICameraClient.h
ICameraClient.h用于描述一个Camera客户端的接口,定义如下所示:classICameraClient:publicIInterface{public:
DECLARE_META_INTERFACE(CameraClient);virtualvoidshutterCallback()=0;
virtualvoidrawCallback(constsp<IMemory>&picture)=0;virtualvoidjpegCallback(constsp<IMemory>&picture)=0;virtualvoidframeCallback(constsp<IMemory>&frame)=0;virtualvoiderrorCallback(status_terror)=0;virtualvoidautoFocusCallback(boolfocused)=0;
};
classBnCameraClient:publicBnInterface<ICameraClient>{public:
virtualstatus_tonTransact(uint32_tcode,
constParcel&data,Parcel*reply,uint32_tflags=0);
};
在定义中,ICameraClient类继承IInterface,并定义了一个Camera客户端的接口,BnCameraClient继
承了BnInterface<ICameraClient>,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。根据BnInterface类模版的定义BnInterface<ICameraClient>类相当于双继承了BnInterface和ICameraClient。
IcameraClient这个类的主要接口是几个回调函数shutterCallback、rawCallback和jpegCallback等,
它们在相应动作发生的时候被调用。作为Camera的“客户端”,需要自己实现几个回调函数,让服务器程序去“间接地”调用它们。2.3头文件Camera.h
Camera.h是Camera对外的接口头文件,它被实现CameraJNI的文件
android_hardware_Camera.cpp所调用。Camera.h最主要是定义了一个Camera类:classCamera:publicBnCameraClient,publicIBinder::DeathRecipient{public: