ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:385.42KB ,
资源ID:12245355      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12245355.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AndroidCamera框架.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AndroidCamera框架.docx

1、AndroidCamera框架Android的Camera架构介绍1.1 Camera概述Android 的 Camera 包含取景器(viewfinder)和拍摄照片的功能。目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。 以开源的Android为例,Camera的代码主要在以下的目录中:Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/在其中Camera.java是主要实现的文件frameworks/bas

2、e/core/java/android/hardware/Camera.java这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。Camera的JAVA本地调用部分(JNI):frameworks/base/core/jni/android_hardware_Camera.cpp这部分内容编译成为目标是libandroid_runtime.so。主要的头文件在以下的目录中:frameworks/base/include/ui/Camera底层库在以下的目录中:frameworks/base/libs/ui/这部分的内容被编译成库libui.so。Ca

3、mera服务部分:frameworks/base/camera/libcameraservice/ 这部分内容被编译成库libcameraservice.so。 为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。1.2 Camera的接口与架构Camera的整体框架图Camera的各个库之间的结构可以用下图的表示: 在Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,

4、类libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera类。 libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。libandroid_runtime.so和libui.so两个库是公用的,其中除了Camera还有其他方面的功能。 Camera部分的头文件在frameworks/base/include/ui/目录中,这个目录是和libmedia.so库

5、源文件的目录frameworks/base/libs/ui/相对应的。 Camera主要的头文件有以下几个: ICameraClient.h Camera.h ICamera.h ICameraService.h CameraHardwareInterface.h在这些头文件Camera.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。整个Camera在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现进程间通讯。这样在客户端调用接口,功能则在服务器中

6、实现,但是在客户端中调用就好像直接调用服务器中的功能,进程间通讯的部分对上层程序不可见。从框架结构上来看,ICameraService.h、ICameraClient.h和ICamera.h三个类定义了camera的接口和架构,ICameraService.cpp和Camera.cpp两个文件用于Camera架构的实现,Camera的具体功能在下层调用硬件相关的接口来实现。从Camera的整体结构上,类Camera是整个系统核心,ICamera类提供了Camera主要功能的接口,在客户端方面调用,CameraService是Camera服务,它通过调用实际的Camera硬件接口来实现功能。事实

7、上,图中红色虚线框的部分都是Camera程序的框架部分,它主要利用了Android的系统的Binder机制来完成通讯。蓝色的部分通过调用Camera硬件相关的接口完成具体的Camera服务功能,其它的部分是为上层的JAVA程序提供JNI接口。在整体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过Android的Bimder来实现进程间的通讯。头文件ICameraClient.hICameraClient.h用于描述一个Camera客户端的接口,定义如下所示:class ICameraClient: public IInterface public: DECLARE_META_

8、INTERFACE(CameraClient); virtual void shutterCallback() = 0; virtual void rawCallback(const sp& picture) = 0; virtual void jpegCallback(const sp& picture) = 0; virtual void frameCallback(const sp& frame) = 0; virtual void errorCallback(status_t error) = 0; virtual void autoFocusCallback(bool focused

9、) = 0; ;class BnCameraClient: public BnInterface public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); ; 在定义中,ICameraClient 类继承IInterface,并定义了一个Camera客户端的接口,BnCameraClient 继承了BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。根据BnInterface类模版的定义BnIn

10、terface类相当于双继承了BnInterface和ICameraClient。 IcameraClient这个类的主要接口是几个回调函数shutterCallback、rawCallback和jpegCallback等,它们在相应动作发生的时候被调用。作为Camera的“客户端”,需要自己实现几个回调函数,让服务器程序去“间接地”调用它们。头文件Camera.h Camera.h是Camera对外的接口头文件,它被实现Camera JNI的文件android_hardware_Camera.cpp所调用。Camera.h最主要是定义了一个Camera类:class Camera : pub

11、lic BnCameraClient, public IBinder: DeathRecipient public: static sp connect(); Camera(); void disconnect(); status_t getStatus() return mStatus; status_t setPreviewDisplay(const sp& surface); status_t startPreview(); void stopPreview(); status_t autoFocus(); status_t takePicture(); status_t setPara

12、meters(const String8& params); String8 getParameters() const; void setShutterCallback(shutter_callback cb, void *cookie); void setRawCallback(frame_callback cb, void *cookie); void setJpegCallback(frame_callback cb, void *cookie); void setFrameCallback(frame_callback cb, void *cookie); void setError

13、Callback(error_callback cb, void *cookie); void setAutoFocusCallback(autofocus_callback cb, void *cookie); / ICameraClient interface virtual void shutterCallback(); virtual void rawCallback(const sp& picture); virtual void jpegCallback(const sp& picture); virtual void frameCallback(const sp& frame);

14、 virtual void errorCallback(status_t error); virtual void autoFocusCallback(bool focused);/ 从接口中可以看出Camera类刚好实现了一个Camera的基本操作,例如播放(startPreview)、停止(stopPreview)、 暂停(takePicture)等。在Camera类中connect()是一个静态函数,它用于得到一个Camera的实例。在这个类中,具有设置回调 函数的几个函数:setShutterCallback、setRawCallback和setJpegCallback等,这几个函数是

15、为了提供给上层 使用,上层利用这几个设置回调函数,这些回调函数在相应的回调函数中调用,例如使用setShutterCallback设置的回调函数指针被 shutterCallback所调用。 在定义中,ICameraClient 类双继承了IInterface和IBinder: DeathRecipient,并定义了一个Camera客户端的接口,BnCameraClient 继承了BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。 事实上,根据BnInterface类模版的定义BnInterface类相当于双继承了 BnInterface和ICam

16、eraClient。这是Android一种常用的定义方式。 继承了DeathNotifier类之后,这样当这个类作为IBinder使用的时候,当这个Binder即将Died的时候被调用其中的binderDied函数。继承这个类基本上实现了一个回调函数的功能。头文件ICamera.h ICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:class ICamera: public IInterface public: DECLARE_META_INTERFACE(Camera); virtual void disconnect() = 0; virtual status_

17、t setPreviewDisplay(const sp& surface) = 0; virtual void setHasFrameCallback(bool installed) = 0; virtual status_t startPreview() = 0; virtual void stopPreview() = 0; virtual status_t autoFocus() = 0; virtual status_t takePicture() = 0; virtual status_t setParameters(const String8& params) = 0; virt

18、ual String8 getParameters() const = 0; ; class BnCamera: public BnInterface public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); ; ICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:在camera类中,主要定义Camera的功能接口,这个类必须被继承才能够使用。值得注意的是,这些接口和Camera类的接口有些类似,但是它们并没有直

19、接的关系。事实上,在Camera类的各种实现中,一般都会通过调用ICamera类的实现类来完成。头文件ICameraService .hICameraService.h用于描述一个Camera的服务,定义方式如下所示:class ICameraService : public IInterface public: DECLARE_META_INTERFACE(CameraService); virtual sp connect(const sp& cameraClient) = 0; ; class BnCameraService: public BnInterface public: vir

20、tual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); ;由于具有纯虚函数, ICameraService 以及BnCameraService必须被继承实现才能够使用,在ICameraService 只定义了一个connect()接口,它的返回值的类型是sp,这个ICamera 是提供实现功能的接口。注意,ICameraService只有连接函数connect(),没有断开函数,断开的功能由ICamera接口来提供。头文件CameraHardwareInte

21、rface.h CameraHardwareInterface.h定义的是一个Camera底层的接口,这个类的实现者是最终实现Camera的。 CameraHardwareInterface 定以Camera硬件的接口,如下所示:class CameraHardwareInterface : public virtual RefBase public: virtual CameraHardwareInterface() virtual sp getPreviewHeap() const = 0; virtual status_t startPreview(preview_callback cb

22、, void* user) = 0; virtual void stopPreview() = 0; virtual status_t autoFocus(autofocus_callback, void* user) = 0; virtual status_t takePicture(shutter_callback, raw_callback, jpeg_callback, void* user) = 0; virtual status_t cancelPicture(bool cancel_shutter, bool cancel_raw, bool cancel_jpeg) = 0;

23、virtual status_t setParameters(const CameraParameters& params) = 0; virtual CameraParameters getParameters() const = 0; virtual void release() = 0; virtual status_t dump(int fd, const Vector& args) const = 0; ; 使用C语言的方式导出符号:extern C sp openCameraHardware(); 在程序的其他地方,使用openCameraHardware()就可以得到一个 Cam

24、eraHardwareInterface,然后调用 CameraHardwareInterface的接口完成Camera的功能。1.3 Camera的主要实现分析JAVA程序部分在packages/apps/Camera/src/com/android/camera/目录的Camera.java文件中,包含了对Camera的调用在Camera.java中包含对包的引用:import android.hardware.Camera.PictureCallback; import android.hardware.Camera.Size; 在这里定义的Camera类继承了活动Activity类,在

25、它的内部,包含了一个 android.hardware.Camerapublic class Camera extends Activity implements View.OnClickListener, SurfaceHolder.Callback android.hardware.Camera mCameraDevice; 对Camera功能的一些调用如下所示:mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);mCameraDevice.startPreview()

26、;mCameraDevice.stopPreview(); startPreview、stopPreview 和takePicture等接口就是通过JAVA本地调用(JNI)来实现的。frameworks/base/core/java/android/hardware/目录中的Camera.java文件提供了一个JAVA类:Camera。public class Camera 在这个类当中,大部分代码使用JNI调用下层得到,例如: public void setParameters(Parameters params) Log.e(TAG, setParameters(); /params.dump(); na

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1