和你一起终身学习,这里是程序员Android
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
一、openCamera 简单调用流程
二、CameraManager.getCameraCharacteristics 获取方法
三、supportsCamera2ApiLocked
四、CameraService.connectDevice
五、CameraManager.setRemoteDevice
一、openCamera 简单调用流程
打开相机是通过调用CameraManager.java (frameworks\base\core\java\android\hardware\camera2)
的 openCamera 方法,根据指定的CameraId 打开。
1.1 CameraManager.openCamera 方法
cameraId 是一个标识,标识当前要打开的camera
callback 是一个状态回调,当前camera被打开的时候,这个状态回调会被触发的。
handler 是传入的一个执行耗时操作的handler
executor 操作线程池
public void openCamera(@NonNull String cameraId...)
throws CameraAccessException {
// 通过Camera Id 打开Camera,调用1.2 openCameraForUid
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
USE_CALLING_UID);
}
public void openCamera(@NonNull String cameraId,
@NonNull @CallbackExecutor Executor executor,
@NonNull final CameraDevice.StateCallback callback)
1.2 CameraManager.openCameraForUid 方法
public void openCameraForUid(@NonNull String cameraId,
.... ... )
throws CameraAccessException {
... ...
//调用异步 Camera 助手 打开Camera ,调用 1.3 openCameraDeviceUserAsync
openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
}
1.3 CameraManager.openCameraDeviceUserAsync 方法
获取当前cameraId指定相机的设备信息
利用获取相机的设备信息创建CameraDeviceImpl实例
调用远程CameraService获取当前相机的远程服务
将获取的远程服务设置到CameraDeviceImpl实例中
返回CameraDeviceImpl实例
private CameraDevice openCameraDeviceUserAsync(String cameraId,... ...)
throws CameraAccessException {
//通过CamerService 获取CameraDevices的 Camera的设备信息 ,参考 二、getCameraCharacteristics 获取方法
CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
CameraDevice device = null;
... ...
// New 一个CameraDeviceImpl对象实例
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId,
callback,
executor,
characteristics,
mContext.getApplicationInfo().targetSdkVersion);
ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
try {
//判断是否支持 Camera2API
// 参考 三、supportsCamera2ApiLocked
if (supportsCamera2ApiLocked(cameraId)) {
// Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
if (cameraService == null) {
throw new ServiceSpecificException(
ICameraService.ERROR_DISCONNECTED,
"Camera service is currently unavailable");
}
//调用远程CameraService获取当前相机的远程服务
// 参考四、CameraService.connectDevice
cameraUser = cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), uid);
} else {
... ...
}
} catch (ServiceSpecificException e) {
... ...
} catch (RemoteException e) {
... ...
}
// TODO: factor out callback to be non-nested, then move setter to constructor
// For now, calling setRemoteDevice will fire initial
// onOpened/onUnconfigured callbacks.
// This function call may post onDisconnected and throw CAMERA_DISCONNECTED if
// cameraUser dies during setup.
//将获取的远程服务设置到CameraDeviceImpl实例中
// 参考 五、setRemoteDevice 方法
deviceImpl.setRemoteDevice(cameraUser);
device = deviceImpl;
}
//返回CameraDeviceImpl实例
return device;
}
1.4 Open Camera 大致时序图
Open Camera 时序图
二、CameraManager.getCameraCharacteristics 获取方法
getCameraCharacteristics 方法通过ICameraService.aidl 获取到 CameraService.cpp 中的getCameraCharacteristics 函数。
public CameraCharacte