和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、前言
二、frameworks openCamera流程
2.1 openCamera详细流程讲解
2.1.1 CameraManager流程
2.1.2 CameraService流程
2.1.3 CameraDeviceClient
2.1.4 Camera2ClientBase
2.1.5 Camera3Device
2.1.6 CameraProviderManager
2.2 厂商CameraDevice实现
一、前言
本文主要介绍基于Android Camera API2的frameworks openCamera流程。
二、frameworks openCamera流程
frameworks openCamera流程图如图2.1。图2.1包含了openCamera的主要流程,通过Binder通讯,实现了Camera API2的openCamera接口到libacameraservice的跨进程调用。
图2.1 openCamera流程图
2.1 openCamera详细流程讲解
图2.1 frameworks openCamera流程图
图2.1 是frameworks openCamera流程图,主要流程是Camera API2应用层接口到libcameraservice的流程。Camera API2应用层部分是CameraManager,libcameraservice包含了CameraService、CameraDeviceClient、Camera2ClientBase、Camera3Device、CameraProviderManager。详细流程如下。
2.1.1 CameraManager流程
path:frameworks/base/core/java/android/hardware/camera2/CameraManager.java
相关流程:opencamera -> openCameraForUid -> openCameraDeviceUserAsync
openCameraDeviceUserAsync关键方法:
671 private CameraDevice openCameraDeviceUserAsync(String cameraId,
672 CameraDevice.StateCallback callback, Executor executor, final int uid,
673 final int oomScoreOffset) throws CameraAccessException {
......
693 try {
694 ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
695 if (cameraService == null) {
696 throw new ServiceSpecificException(
697 ICameraService.ERROR_DISCONNECTED,
698 "Camera service is currently unavailable");
699 }
//cameraUser就是mRemoteDevice
700 cameraUser = cameraService.connectDevice(callbacks, cameraId,
701 mContext.getOpPackageName(), mContext.getAttributionTag(), uid,
702 oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion);
mRemoteDevice是CameraDeviceClient,获取mRemoteDevice用于后续CameraDeviceClient的配流(createStream),起预览(submitRequestList)。
2.1.2 CameraService流程
path:xref: /frameworks/av/services/camera/libcameraservice/CameraService.cpp
由于openCamera需要获取mCameraProviderManager对象用于通知Camera hal打开camera,因此CameraService首先需要初始化mCameraProviderManager。
mCameraProviderManager初始化流程:CameraService的超级类(所有类的父类)是RefBase,实例化的时候会调用onFirstRef()函数,在onFirstRef()函数中会调用enumerateProviders()实例化mCameraProviderManager ,并执行mCameraProviderManager初始化。
相关流程:onFirstRef ->enumerateProviders -> new CameraProviderManager
202 status_t Camera