为了执行Camera的功能,Camera应用需要完成和Camera原生服务的一系列通信,如启动预览、自动对焦、拍照等,以及基于模拟器下CameraHardwareStub的实现。Camera应用调用Camera原生接口的过程如下图所示。

Java层调用Camera原生服务的过程
流程说明:
在系统启动时,Android Runtime会调用register_android_hardware_Camera()注册Camera相关的navtive函数到JNI。当Camera应用启动后,首先会通过Camera客户端向Camera原生服务发出连接Camera设备的请求。Camera原生服务在收到连接Camera设备的请求后,创建一个内部类Client的对象,调用HAL的CameraHardwareInterface::openCameraHardware()方法打开Camera设备,在模拟器环境下,会创建一个CameraHardwareStub对象,配置初始化参数。调用HAL的CameraHardwareStub::useOverlay()方法,设置图像的渲染方式为Overlay。
在Aurora中,在默认情况下,预览帧速率为15帧/秒,预览帧元数据为YUV 420,拍照分辨率为2048×1536像素,图像质量为100。参数初始化工作在QualcommCamera Hardware:: initDefaultParameters()方法中实现。
当Java层发出预览请求后,经过Camera客户端的转发,Camera原生服务会调用HAL层的CameraHardwareStub::startPreview()方法创建一个预览线程,在该线程中接收硬件上传的数据。如果是在模拟器上运行,则将FakeCamera的数据传给UI,在原始Android代码中,默认的预览分辨率为176×144像素(QCIF)。在Aurora中,目前支持的预览分辨率为WVGA、VGA、HVGA、CIF、QVGA、QCIF。
当Java层发出自动对焦请求后,经过Camera客户端的转发,Camera原生服务会调用HAL层的CameraHardwareStub:: autoFocus ()方法创建一个自动对焦的线程。
当Java层发出拍照请求后,经过Camera客户端的转发,Camera原生服务会调用HAL层的CameraHardwareStub:: takePicture ()方法完成Camera的拍照工作,然后通过回调函数传给UI。