依次获取设备信息,如果是获取到后置摄像头(默认),则调用 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-facing camera,
* this returns null.
* @see #open(int)
*/publicstatic Camera open() {
int numberOfCameras = getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
returnnew Camera(i);
}
}
returnnull;
}
Camera(int cameraId):
通过调用 cameraInitNormal(Id) 方法对指定摄像头进行初始化。
/** used by Camera#open, Camera#open(int) */
Camera(int cameraId) {
int err = cameraInitNormal(cameraId);
if (checkInitErrors(err)) {
if (err == -EACCES) {
thrownew RuntimeException("Fail to connect to camera service");
} elseif (err == -ENODEV) {
thrownew RuntimeException("Camera initialization failed");
}
// Should never hit this. thrownew RuntimeException("Unknown camera error");
}
}
cameraInitNormal(int cameraId):
指定 halVersion 参数。
调用 cameraInitVersion(int cameraId, int halVersion)。
// connect to camera servicestatic jint android_hardware_Camera_native_setup(JNIEnv *env,
jobject thiz, jobject weak_this,
jint cameraId, jint halVersion,
jstring clientPackageName)
{
// convert jstring to String16(clientPackageName -> clientName)
......
......
sp<Camera> camera;
if (halVersion == CAMERA_HAL_API_VERSION_NORMAL_CONNECT) {
/***** NOTE THIS *****/// Default path: hal version is do