当前位置:操作系统 > 安卓/Android >>

Android的Camera架构介绍

                 Android的Camera架构介绍
 第一部分 Camera概述
Android的Camera包含取景器(viewfinder)和拍摄照片的功能。目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端(Client)和服务器(Server)两个部分,它们建立在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库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。
 
第二部分 Camera的接口与架构
2.1 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来实现进程间的通讯。
 
2.2 头文件ICameraClient.h
ICameraClient.h用于描述一个Camera客户端的接口,定义如下所示:
class ICameraClient: public IInterface
{
public:
    DECLARE_META_INTERFACE(CameraClient);
    virtual void shutterCallback() = 0;
    virtual void rawCallback(const sp<IMemory>& picture) = 0;
    virtual void jpegCallback(const sp<IMemory>& picture) = 0;
    virtual void frameCallback(const sp<IMemory>& frame) = 0;
    virtual void errorCallback(status_t error) = 0;
    virtual void autoFocusCallback(bool focused) = 0;
};
 
class BnCameraClient: public BnInterface<ICameraClient>
{
public:
    virtual status_t onTransact( uint32_t code,
                                const Parcel& data,
                                Parcel* reply,
                                uint32_t flags = 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对外的接口头文件,它被实现Camera JNI的文件android_hardware_Camera.cpp所调用。Camera.h最主要是定义了一个Camera类:
class Camera : public BnCameraClient, public IBinder:: DeathRecipient
{
public:
    static  sp<Camera>  connect();
                        ~Camera();
            void        disconnect();
            status_t    getStatus() { return mStatus; }
            status_t    setPreviewDisplay(const sp<Surface>& surface);
            status_t    startPreview();
            void        stopPreview();
            status_t    autoFocus();
            status_t    takePicture();
            status_t    setParameters(const String8& params);
            String8     getParameters() const;
            void        setShutterCallback(shutter_callback cb, void *cookie);
            void   

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,