AndroidCamera框架.docx

上传人:b****4 文档编号:12245355 上传时间:2023-04-17 格式:DOCX 页数:18 大小:385.42KB
下载 相关 举报
AndroidCamera框架.docx_第1页
第1页 / 共18页
AndroidCamera框架.docx_第2页
第2页 / 共18页
AndroidCamera框架.docx_第3页
第3页 / 共18页
AndroidCamera框架.docx_第4页
第4页 / 共18页
AndroidCamera框架.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

AndroidCamera框架.docx

《AndroidCamera框架.docx》由会员分享,可在线阅读,更多相关《AndroidCamera框架.docx(18页珍藏版)》请在冰豆网上搜索。

AndroidCamera框架.docx

AndroidCamera框架

Android的Camera架构介绍

1.1Camera概述

 Android的Camera包含取景器(viewfinder)和拍摄照片的功能。

目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。

   以开源的Android为例,Camera的代码主要在以下的目录中:

 Camera的JAVA程序的路径:

 packages/apps/Camera/src/com/android/camera/

 在其中Camera.java是主要实现的文件

 

 frameworks/base/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。

 

 Camera服务部分:

 frameworks/base/camera/libcameraservice/

 这部分内容被编译成库libcameraservice.so。

 

   为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用videoforlinux驱动程序和Jpeg编码程序实现)。

这个库将被Camera的服务库libcameraservice.so调用。

1.2Camera的接口与架构

Camera的整体框架图

Camera的各个库之间的结构可以用下图的表示:

  在Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,类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库源文件的目录frameworks/base/libs/ui/相对应的。

 

   Camera主要的头文件有以下几个:

       ICameraClient.h

       Camera.h

       ICamera.h

       ICameraService.h

       CameraHardwareInterface.h

 

 在这些头文件Camera.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。

 整个Camera在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现进程间通讯。

这样在客户端调用接口,功能则在服务器中实现,但是在客户端中调用就好像直接调用服务器中的功能,进程间通讯的部分对上层程序不可见。

 从框架结构上来看,ICameraService.h、ICameraClient.h和ICamera.h三个类定义了camera的接口和架构,ICameraService.cpp和Camera.cpp两个文件用于Camera架构的实现,Camera的具体功能在下层调用硬件相关的接口来实现。

从Camera的整体结构上,类Camera是整个系统核心,ICamera类提供了Camera主要功能的接口,在客户端方面调用,CameraService是Camera服务,它通过调用实际的Camera硬件接口来实现功能。

事实上,图中红色虚线框的部分都是Camera程序的框架部分,它主要利用了Android的系统的Binder机制来完成通讯。

蓝色的部分通过调用Camera硬件相关的接口完成具体的Camera服务功能,其它的部分是为上层的JAVA程序提供JNI接口。

在整体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过Android的Bimder来实现进程间的通讯。

头文件ICameraClient.h

 ICameraClient.h用于描述一个Camera客户端的接口,定义如下所示:

 classICameraClient:

publicIInterface

 {

 public:

   DECLARE_META_INTERFACE(CameraClient);

   virtualvoidshutterCallback()=0;

   virtualvoidrawCallback(constsp&picture)=0;

   virtualvoidjpegCallback(constsp&picture)=0;

   virtualvoidframeCallback(constsp&frame)=0;

   virtualvoiderrorCallback(status_terror)=0;

   virtualvoidautoFocusCallback(boolfocused)=0;

 };

 

 classBnCameraClient:

publicBnInterface

 {

 public:

   virtualstatus_tonTransact(uint32_tcode,

                 constParcel&data,

 Parcel*reply,

                 uint32_tflags=0);

 };

   在定义中,ICameraClient类继承IInterface,并定义了一个Camera客户端的接口,BnCameraClient继承了BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。

根据BnInterface类模版的定义BnInterface类相当于双继承了BnInterface和ICameraClient。

 

   IcameraClient这个类的主要接口是几个回调函数shutterCallback、rawCallback和jpegCallback等,它们在相应动作发生的时候被调用。

作为Camera的“客户端”,需要自己实现几个回调函数,让服务器程序去“间接地”调用它们。

 

头文件Camera.h

 

     Camera.h是Camera对外的接口头文件,它被实现CameraJNI的文件android_hardware_Camera.cpp所调用。

Camera.h最主要是定义了一个Camera类:

 classCamera:

publicBnCameraClient,publicIBinder:

:

DeathRecipient

 {

 public:

   static sp connect();

             ~Camera();

       void    disconnect(); 

       status_t  getStatus(){returnmStatus;}

       status_t  setPreviewDisplay(constsp&surface);

       status_t  startPreview();

       void    stopPreview();

       status_t  autoFocus();

       status_t  takePicture();

       status_t  setParameters(constString8¶ms);

       String8   getParameters()const;

       void    setShutterCallback(shutter_callbackcb,void*cookie);

       void    setRawCallback(frame_callbackcb,void*cookie);

       void    setJpegCallback(frame_callbackcb,void*cookie);

       void    setFrameCallback(frame_callbackcb,void*cookie);

       void    setErrorCallback(error_callbackcb,void*cookie);

    void    setAutoFocusCallback(autofocus_callbackcb,void*cookie);

   //ICameraClientinterface

   virtualvoid    shutterCallback();

   virtualvoid    rawCallback(constsp&picture);

   virtualvoid    jpegCallback(constsp&picture);

   virtualvoid    frameCallback(constsp&frame);

   virtualvoid    errorCallback(status_terror);

   virtualvoid    autoFocusCallback(boolfocused);

 //……

 }

 

     从接口中可以看出Camera类刚好实现了一个Camera的基本操作,例如播放(startPreview)、停止(stopPreview)、暂停(takePicture)等。

在Camera类中connect()是一个静态函数,它用于得到一个Camera的实例。

在这个类中,具有设置回调函数的几个函数:

setShutterCallback、setRawCallback和setJpegCallback等,这几个函数是为了提供给上层使用,上层利用这几个设置回调函数,这些回调函数在相应的回调函数中调用,例如使用setShutterCallback设置的回调函数指针被shutterCallback所调用。

     在定义中,ICameraClient类双继承了IInterface和IBinder:

:

DeathRecipient,并定义了一个Camera客户端的接口,BnCameraClient继承了BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。

事实上,根据BnInterface类模版的定义BnInterface类相当于双继承了BnInterface和ICameraClient。

这是Android一种常用的定义方式。

     继承了DeathNotifier类之后,这样当这个类作为IBinder使用的时候,当这个Binder即将Died的时候被调用其中的binderDied函数。

继承这个类基本上实现了一个回调函数的功能。

 

 

 头文件ICamera.h

 

   ICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:

 classICamera:

publicIInterface

 {

 public:

   DECLARE_META_INTERFACE(Camera); 

   virtualvoid    disconnect()=0;

   virtualstatus_t setPreviewDisplay(constsp&surface)=0;

   virtualvoid    setHasFrameCallback(boolinstalled)=0;

   virtualstatus_t startPreview()=0;

   virtualvoid    stopPreview()=0;

   virtualstatus_t autoFocus()=0;

   virtualstatus_t takePicture()=0;

   virtualstatus_t setParameters(constString8¶ms)=0;

   virtualString8  getParameters()const=0;

 };

 classBnCamera:

publicBnInterface

 {

 public:

   virtualstatus_t  onTransact(uint32_tcode,

                   constParcel&data,

                   Parcel*reply,

                   uint32_tflags=0);

 };

 

   ICamera.h描述的内容是一个实现Camera功能的接口,其定义如下所示:

 在camera类中,主要定义Camera的功能接口,这个类必须被继承才能够使用。

值得注意的是,这些接口和Camera类的接口有些类似,但是它们并没有直接的关系。

事实上,在Camera类的各种实现中,一般都会通过调用ICamera类的实现类来完成。

 

头文件ICameraService.h

 ICameraService.h用于描述一个Camera的服务,定义方式如下所示:

 classICameraService:

publicIInterface

 {

 public:

   DECLARE_META_INTERFACE(CameraService);

   virtualsp   connect(constsp&cameraClient)=0;

 };

 classBnCameraService:

publicBnInterface

 {

 public:

   virtualstatus_t  onTransact(uint32_tcode,

                   constParcel&data,

                   Parcel*reply,

                   uint32_tflags=0);

 };

 

 由于具有纯虚函数,ICameraService以及BnCameraService必须被继承实现才能够使用,在ICameraService只定义了一个connect()接口,它的返回值的类型是sp,这个ICamera是提供实现功能的接口。

注意,ICameraService只有连接函数connect(),没有断开函数,断开的功能由ICamera接口来提供。

 头文件CameraHardwareInterface.h

 

   CameraHardwareInterface.h定义的是一个Camera底层的接口,这个类的实现者是最终实现Camera的。

 

   CameraHardwareInterface定以Camera硬件的接口,如下所示:

 classCameraHardwareInterface:

publicvirtualRefBase{

 public:

   virtual~CameraHardwareInterface(){}

   virtualsp     getPreviewHeap()const=0;

   virtualstatus_t  startPreview(preview_callbackcb,void*user)=0;

   virtualvoid    stopPreview()=0;

   virtualstatus_t  autoFocus(autofocus_callback,

                  void*user)=0;

   virtualstatus_t  takePicture(shutter_callback,

                   raw_callback,

                   jpeg_callback,

                   void*user)=0;

   virtualstatus_t  cancelPicture(boolcancel_shutter,

                    boolcancel_raw,

                    boolcancel_jpeg)=0;

   virtualstatus_t  setParameters(constCameraParameters¶ms)=0;

   virtualCameraParameters getParameters()const=0;

   virtualvoidrelease()=0;

   virtualstatus_tdump(intfd,constVector&args)const=0;

 };

 

   使用C语言的方式导出符号:

 extern"C"spopenCameraHardware();

   在程序的其他地方,使用openCameraHardware()就可以得到一个CameraHardwareInterface,然后调用CameraHardwareInterface的接口完成Camera的功能。

1.3Camera的主要实现分析

JAVA程序部分

 

 在packages/apps/Camera/src/com/android/camera/目录的Camera.java文件中,包含了对Camera的调用

 在Camera.java中包含对包的引用:

 importandroid.hardware.Camera.PictureCallback;

 importandroid.hardware.Camera.Size;

 

   在这里定义的Camera类继承了活动Activity类,在它的内部,包含了一个android.hardware.Camera

 publicclassCameraextendsActivityimplementsView.OnClickListener,SurfaceHolder.Callback{     android.hardware.CameramCameraDevice;

 }

 

   对Camera功能的一些调用如下所示:

 mCameraDevice.takePicture(mShutterCallback,mRawPictureCallback,mJpegPictureCallback);

 mCameraDevice.startPreview();

 mCameraDevice.stopPreview();

 

   startPreview、stopPreview和takePicture等接口就是通过JAVA本地调用(JNI)来实现的。

 

 frameworks/base/core/java/android/hardware/目录中的Camera.java文件提供了一个JAVA类:

Camera。

 

 publicclassCamera{

 }

   在这个类当中,大部分代码使用JNI调用下层得到,例如:

   publicvoidsetParameters(Parametersparams){

     Log.e(TAG,"setParameters()");

     //params.dump();

     na

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

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

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