Android的Camera包含取景器(viewfinder)和拍摄照片的功能。其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。
Camera的JAVA程序的路径:
packages/apps/Camera/src/com/android/camera/
frameworks/base/core/java/android/hardware/Camera.javaframeworks/base/core/jni/android_hardware_Camera.cpp
主要的头文件在以下的目录中:
frameworks/base/include/ui/
Camera底层库在以下的目录中:
frameworks/base/libs/ui/
Camera服务部分:
frameworks/base/camera/libcameraservice/
为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。
在Camera系统的各个库中,libui.so位于核心的位置;
libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。
摄像头系统提供的功能如下几个方面:
a、预览功能preview
b、视频儿取功能 recording
c、拍照功能 takePicture
d、参数设置

通过阅读其interface函数知道,ICamera中提供的都是控制类接口,而ICameraClient定义的都是回调函数
接口,即真正的数据流传输都是通过回调函数实现的。
拍照功能:
//* take a picture - image is returned in callback */
status_t CameraService::Client::takePicture()
{
LOGV("takePicture (pid %d)", getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPid();
if (result != NO_ERROR) return result;
if (mHardware == 0) {
LOGE("mHardware is NULL, returning.");
return INVALID_OPERATION;
}
mHardware->enableMsgType(CAMERA_MSG_SHUTTER |
CAMERA_MSG_POSTVIEW_FRAME |
CAMERA_MSG_RAW_IMAGE |
CAMERA_MSG_COMPRESSED_IMAGE);
return mHardware->takePicture();
}
这里用到了mHardware对象,调用所有的HAL层接口都是通过这个对象进行操作的,而这是如何生成的呢?
mHardware = openCameraHardware();
注意这个函数 openCameraHardware() , 这个函数位于硬件抽象层libcamera.so库中,函数定义如下:
/* factory function to instantiate a camera hardware object */
extern "C" sp<CameraHardwareInterface> openCameraHardware();
主要有两个线程:
pictureThread 拍照线程
当用户使用拍照的功能的时候,拍照线程被调用(非循环),检测队列中的帧数据,将帧数据从队列中取出,
拍照的数据一定需要传到Java层,所有可以将数据转换成JPEG格式再上传,也可以转换成RGB的数据上传给java层
previewThread 预览线程
当预览方法被调用的时候启动预览线程,循环的检测队列中是否有帧数据,如果帧数据存在,读取帧数据,由于读取的数据为YUV格式的数据,所有要将YUV数据转换成RGB的送给显示框架显示,也可以将转换过的数据送给视频编码模块,编码成功后储存变成录像的功能