萝卜和青菜--Android camera框架与使用

来源:互联网 发布:淘宝 天衣无缝 墙布 编辑:程序博客网 时间:2024/04/27 14:51

Android camera主要结构如图所示。
我们可以从三个层次去使用它:JAVA层,service层和hardwareinterface。
流程都大同小异,不同编程语言具体实现上接口略有不同, 流程框架如下:
open,
getParameters,
parameters。set
setParameters,
addcallback,
startpreview(takepicture)
Java层具体例子:
android.hardware.Camera提供了一个接口对象: Camera,用户在程序内调用这个对象的各个功能就可以了. 值得注意的是它的callback, 是可以通过setPreviewCallbackWithBuffer来设置外部缓冲区接受Camera 帧数据的,接口名为PreviewCallback, 需要你在程序中设置实现。每当camera一帧数据采集到时,这个接口会被自动调用。用户可以从你自己所属的缓冲取出数据操作了。
service层:
接口:ICamera。
调用方法:    
    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> binder = sm->getService(String16("camera"));
    sp<ICameraService> service = interface_cast<ICameraService>(binder);
    sp<ICamera>camera= service->connect(const sp<ICameraClient>& cameraClient);
其中参数ICameraClient可以设定callback函数:
     notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
     dataCallback(int32_t msgType, const sp<IMemory>& data)
     dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data)
其他使用方法不再赘述。
HardwareInterface层:
接口:CameraHardwareInterface,
调用方法:
CameraHardwareInterface= openCameraHardware();
流程例子:
    camera_hw = openCameraHardware();
    if(camera_hw  == NULL){
        LOGE("openCameraHardware() failed/n");
        return -1;
    }
    
    camera_hw->setCallbacks(notify_cb,
                               data_cb,
                               data_cb_timestamp,
                               (void *)NULL);

    CameraParameters parameters = camera_hw->getParameters();
    parameters.setPreviewSize(1024, 600);
    camera_hw->setParameters(parameters);
    camera_hw->startPreview();