編輯:Android開發教程
Preview data Preview callback
Android Camera小系統:
嗯……直接看Camera HAL層,它實現是主要的工作, 它一般通過ioctl調用V4L2 command ①從linux kernel中的camera driver①得到preview數據. 然後交給surface(或overlay)顯示或者保存為文件.在HAL層需要打開對應的設備文件,並通過ioctrl訪問camera driver. Android通過這個HAL層來保證底層硬件(驅動)改變,只需修改對應的HAL層代碼,FrameWork層與JAVA Ap的都不用改變.
注釋:①V4L2(video 4 linux 2)
備注:①這個驅動並不是camera本身而是控制camera的主設備,這個camera控制器在linux裡被抽象成為v4l2層通用,最後由 (*attach)連接到具體每個不同的camera設備驅動裡。camera=camera控制器+外接的camera sensor,控制器集成在cpu裡,linux下的設備結點就是/dev/video0.
preview數據的顯示過程:
簡單概括為
Java app 呼叫 ② Jni ,Jni調用各種.so : libandroid_runtime.so ---> libcamera_client.so ---> Binder IPC---> libcameraservice.so ---> libcamera.so 注釋:②請原諒我用【呼叫】這個動詞,實在想不出更加形象的詞匯了。
詳細說明
1.打開linux kernel中的camera driver的設備文件,調用CameraHardwareInterface.h 中定義的openCameraHardware(),打開camera driver的設備文件(例如/dev/video0).
2.CameraHardwareInterface.h 中定義的 setParameters()函數,傳參告訴camera HAL使用哪一個硬件攝像頭,以及它工作的參數(size, format等等),並在HAL層分配存儲preview數據的buffers(如果buffers是在linux kernel中的camera driver中分配的,並拿到這些buffers mmap後的地址指針).
3.如果不使用overlay那設置顯示目標就在libcameraservice.so 中,不會進Camera HAL動態庫.並將上一步拿到的preview數據buffers地址注冊到surface中. 如果使用overlay那在libcameraservice.so 中會通過傳進來的Isurface創建Overlay類的實例,然後調用CameraHardwareInterface.h 中定義的 setOverlay()設置到Camera HAL動態庫中.
4.開始preview,調用到CameraHardwareInterface.h 中定義的 startPreview()函數.startPreviewMode會處理preview的顯示介質,如果使用Overlay顯示,會設置相應的Overlay,同時調用mHardware->startPreview()以啟動preview;否則先調用mHardware->startPreview()啟動preview,然後設置buffer:調用函數registerPreviewBuffers(),它會調用mHardware->getPreviewHeap(),從HAL層獲得preview的buffer,將其設置給Surface去顯示preview的結果。
Preview數據可以通過Overlay和Surface兩種介質去顯示
1、使用Overlay顯示
overlay 一般用在 camera preview, 視頻播放等需要高幀率的地方, 還有可能 UI 界面設計的需求,如 map 地圖查看軟件需兩層顯示信息. overlay需要硬件與驅動的支持.Overlay 沒有 java 層的 code, 也就沒有 JNI 調用. 一般都在 native 中使用.
如果要使用Overlay,底層硬件必須支持Overlay。在CameraService::Client的構造函數中,有相應的判斷。
CameraService::Client::Client(const sp<CameraService>& cameraService,
const sp<ICameraClient>& cameraClient, pid_t clientPid){}
若mUseOverlay = mHardware->useOverlay();返回值為true,則表示硬件支持Overlay;否則只能使用Surface顯示。Android系統中提供了Overlay的接口,其具體實現需要自己做.
關於多層 overlay:例如需要同時支持 overlay1 與 overlay2.需在overlay hal 的 overlay_control_device_t 中要添加 overlay1 與 overlay2 的結構.如:
struct overlay_control_context_t { struct overlay_control_device_t device; /* our private state goes below here */ struct overlay_t* overlay_video1;//overlay1 struct overlay_t* overlay_video2;//overlay2 };
每個 overlay_t 代表一層 overlay, 每層 ovelay 有自己的 handle.可以使用自定義參數調用 overlay_control_device_t:: setParameter()來指明. Hal 層具體來實現,通過 Overlay object 來拿到 overlay1 與 overlay2 的 buffer 指針.
 
Android平台, 可以使用本地資源, 也可以使用系統資源;使用靜態R類訪問資源, R類中包含一個靜態子類, R類中每一個子類都把它的相關資源表示為變量的形式;資源表被
前面在Android RoboGuice 使用指南(1):概述 對應Roboguice做了簡要的介紹 ,之後介紹了Google Guice的基本用法,Roboguice是
iPhone第一個真正意義上的競爭對手G1如期而來,正如蘋果的產品一樣,這是一個強大的掌上電腦,並且擁有一個開源的操作系統,和一個智能的指觸式用戶界面。和iPhone一樣
項目簡介這裡提供的Password Manager項目是Steven Osborn編寫的PasswordSafe(在Apache License下發行)的改寫版,目前已經