前面把Camera open在Framework的流程已經梳理清楚,但是還有一些細節值得一提。
CameraDevice.StateCallback與Executor
在open方法中傳入了一個Executor對象,這個對象是在執行Callback時使用的。作爲一個接口, CameraDeviceImpl中有一個靜態內部類CameraHandlerExecutor作爲實現。
外部調用checkAndWrapHandler方法就可以構造。
而這個Executor對象在open方法,構建deviceImpl對象時被傳入,並賦值給mDeviceExecutor變量。
隨後在setRemoteDeviecs方法中執行
語句,調用mCallOnOpened的Runnable對象。在run方法中調用了onOpened方法,並傳入了CameraDeviceImpl對象。
此時在應用內的StateCallback的onOpened方法就會獲得cameraDevice對象,進行後續操作。遵循同樣的方式,我們可以在CameraDeviceImpl中找到StateCallback的全部方法調用。
getCameraCharacteristics方法
這個方法在open過程中被調用了數次,在CameraManager中的邏輯很簡單,就是調用CameraService的getCameraCharacteristics方法,返回CameraMetadataNative對象,從而構建CameraCharacteristics對象並返回。
同樣在CameraService中也是調用CameraProviderManager的getCameraCharacteristics方法,並返回了一個DeviceInfo3,這個名字後面的數字對應HAL的版本,即HAL3。
整體流程是比較清晰的,需要注意的僅僅是應用層所使用的CameraCharacteristics,與get過程中涉及到的CameraMetadataNative.java、CameraMetadataNative.h、DeviceInfo3類型是不同的,後者類型相同。