1. 程式人生 > 實用技巧 >android上層得到底層資料的回撥機制

android上層得到底層資料的回撥機制

>>> hot3.png

以Camera為例,看看應用程式如何獲得拍照的圖片。

Camera類中拍照的方法是Capture(),它通過繼承類android.hardware.Camera中的介面回撥函式

Jerikc: 不是 PictureCallback ,而是PictureCallback介面中的onPictureTaken()
得到jpegData,這個jpegData正是從底層得到的影象資料。

當我們按下快門按鈕,Camera應用程式呼叫Capture方法,開啟一個拍照的執行緒,當整個拍照過程在底層全部完成以後,該執行緒會把拍好的照片資料通過訊息機制傳送給Camera物件,

Jerikc:
此處,frameworks\base\core\java\android\hardware\Camera.java中,
先通過Handler得到包含picture byte[]資料的Message物件,
如果Message物件是CAMERA_MSG_COMPRESSED_IMAGE型別,
則呼叫回撥函式 onPictureTaken((byte[])msg.obj,mCamera),
而它的實現恰恰是在 packages\apps\Camera\src\com\android\camera\Camera.java中,即

mImageSaver.addImage(jpegData, mLocation, s.width, s.height); ...

底層資料由C++空間進入JAVA空間,需要JNI 層介面,這裡就是postEventFromNative()

再往下走走,就到了Camera的原生代碼,我們知道,Camera系統由客戶端t和服務端組成,

客戶端就是我們的應用程式,服務端CameraService呼叫抽象層方法得到底層資料。

這裡,客戶端由Camera::dataCallback()得到服務端CameraService::client::dataCallback()資料,

程式碼多了容易思路混亂,最後做個總結。

轉載於:https://my.oschina.net/jerikc/blog/90797