Android Runtime:android_hardware_Camera.cpp
Library:Camera Client和Camera Service
HAL:CameraHardwareInterface
Open flow
1. Framework
1.1 Camera.java
路径:frameworks/base/core/java/android/hardware/Camera.java
首先从 Open() 方法开始:
获取 Camera 设备的个数。
依次获取设备信息,如果是获取到后置摄像头(默认),则调用 new Camera(int) 构造对应的摄像头实例。
注释翻译:
构造一个新的摄像头对象,以获取第一个后置摄像头。
若设备中没有后置摄像头,则返回 null 。
NOTE:还有一个方法 open(int) ,它可以直接指定打开的摄像头。
/***
* Creates a new Camera object to access
* the first back-facing camera on the
* device. If the device does not have a back-facingcamera,
* this returns null.
* @see #open(int)
*/
public static Camera open() {
intnumberOfCameras = getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for(int i = 0; i < numberOfCameras; i++) {
getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
return new Camera(i);
}
}
returnnull;
}
Camera(int cameraId):
通过调用 cameraInitNormal(Id) 方法对指定摄像头进行初始化。
/** used by Camera#open, Camera#open(int)*/
Camera(int cameraId) {
interr = cameraInitNormal(cameraId);
if(checkInitErrors(err)) {
if (err == -EACCES) {
throw new RuntimeException("Fail to connect to camera service");
} else if (err == -ENODEV) {
throw new RuntimeException("Camera initialization failed");
}
//Should never hit this.
thrownew RuntimeException("Unknown camera error");
}
}
cameraInitNormal(int cameraId):
指定 halVersion 参数。
调用 cameraInitVersion(int cameraId, int halVersion)。
private int cameraInitNormal(int cameraId){
returncameraInitVersion(cameraId,
CAMERA_HAL_API_VERSION_NORMAL_CONNECT);
}
cameraInitVersion(int cameraId, inthalVersion):
将各个回调函数置空。
Looper 的作用没有仔细研究,从代码逻辑上看,可能与事件的监听(需要循环操作)有关。
通过 Looper 对事件处理对象进行实例化后,就调用 native_setup 方法进入 JNI(Java NativeInterface) 库中调用对应的函数。
至此,open() 方法开始进入 Android Runtime 层。
private int cameraInitVersion(int cameraId,
int halVersion){
mShutterCallback = null;
mRawImageCallback = null;
mJpegCallback = null;
mPreviewCallback = null;
mPostviewCallback = null;
mUsingPreviewAllocation = false;
mZoomListener = null;
Looper looper;
if ((looper = Looper.myLooper()) != null){
mEventHandler = new EventHandler(this, looper);
}else if ((looper = Looper.getMainLooper()) != null) {
mEventHandler = new EventHandler(this, looper);
}else {
mEventHandler = null;
}
returnnative_setup(new WeakReference<Camera>(this),
cameraId, halVersion,
ActivityThread.currentOpPackageName());
}
1.2 Framework 中流程简图
2. Android Runtime
2.1 android_hardware_Camera.cpp
路径:frameworks/base/core/jni/android_hardware_Camera.cpp
native_setup():
刚开始要先把 clientPackageName 做一个类型转换,变成 clientName。