和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
1.app层 MainActivity.java CameraManager 可以直接调用 其openCamera 方法
getCameraIdList 用来存储可用Camera设备 list, openCamera 成功后会调用CameraDevice.StateCallback#onOpened,
然后会创建Session CameraDevice#createCaptureSession 以及拍照CameraDevice#createCaptureRequest等等。
public class MainActivity extends AppCompatActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) {
... ...
//
CameraManager mCameraManager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
... ...
}
2.CameraManager.java
(frameworks\base\core\java\android\hardware\camera2)
CameraManager 会根据传递过来的参数不同,调用不同的Opencamera 方法。
@RequiresPermission(android.Manifest.permission.CAMERA)
public void openCamera(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
throws CameraAccessException {
openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
USE_CALLING_UID);
}
// CameraDeviceImpl.checkAndWrapHandler 会将 Handler 封装成Executor 类型
public static Executor checkAndWrapHandler(Handler handler) {
return new CameraHandlerExecutor(checkHandler(handler));
}
@RequiresPermission(android.Manifest.permission.CAMERA)
public void openCamera(@NonNull String cameraId,
@NonNull @CallbackExecutor Executor executor,
@NonNull final CameraDevice.StateCallback callback)
throws CameraAccessException {
openCameraForUid(cameraId, callback, executor, USE_CALLING_UID);
}
从代码中看,openCamera 参数主要区别是 CallbackExecutor 、Handler 这两个,最终都会走到 openCameraForUid 方法。
openCameraForUid 主要是 根据 Camera id 打开一个Camera 连接。
public void openCameraForUid(@NonNull String cameraId,
@NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
int clientUid)
throws CameraAccessException {
//
openCameraDeviceUserAsync(cameraId, callback, executor, clientUid);
}
openCameraForUid 会调用 openCameraDeviceUserAsync 方法去帮助opencamera 连接的创建
private CameraDevice openCameraDeviceUserAsync(String cameraId,
CameraDevice.StateCallback callback, Executor executor, final int uid)
throws CameraAccessException {
// 获取 特定camera的特性
CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new CameraDeviceImpl();
ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks()
if (supportsCamera2ApiLocked(cameraId)) {
// Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices