天天看點

Android 前置攝像頭調試紀要

最近在調試Android 2.3.5(基于cm的代碼)的前置攝像頭,将遇到的問題與解決的方法記錄下來,以便回顧。

1:)上層應用無法擷取前置攝像頭的資訊?

前置攝像頭的消息一般回存在與HAL層中,例如三星的crespo中就是這麼處理的。但是CM關于HTC的适配中去比較奇怪的将這些接口實作在了framework層(CameraService.cpp)。這應該是和Android的架構是沖突的。而且對于非HTC的手機,在擷取前攝像頭的數目時直接傳回了1。導緻上層檢測不到前置攝像頭的存在。 解決方法:在CameraService中關掉cm關于擷取攝像頭的修改,在HAL層加以實作。主要的接口有HAL_getNumberOfCameras, HAL_getCameraInfo, HAL_openCameraHardware 。

2:)當按下快門按鈕後,preview顯示自動對焦的小框,但是并沒有拍照的動作,而且回導緻程式死掉。

産生原因:在2.3.5中,CameraService::Client在調用自動對焦函數autofocos時,會掉用到HAL層的autofocus函數。我調試的硬體不具備自動對焦的功能,但是由于前期參數沒有設定正确,會調用到這個地方來。而在HAL層的autofucs中回同歸notifycallback回調函數通知CameraService::Client。但在2.3.5的notifyCallback中添加了lockIfMessageWanted函數,改函數回嘗試回去鎖,如果擷取不到就一直去擷取。而這時候autofocus還沒有執行完(永遠不會執行完),還持有着。是以會導緻死鎖。而且導緻以後按下快門鍵後移植不會去執行拍照的操作,因為改動做也要首先去擷取鎖。

解決方法其實很簡單,在初始化CameraParameters的時候,給focusmode設定成INFINITY就可以啦。如果有自動對焦的功能,也不可以在aotufocus的程序中去通知framework層,可以通過建立一個detached的線程傳回狀态。

3:)前置拍照可以用了,但是當切換到攝像的時候,程序回死掉。

産生原因攝像最終存儲成3GP或者mp4檔案是需要編碼去進行編碼的。而這些資訊是有MeidaProfiles.cpp檔案進行控制的。改類回在初始化時,會去/etc下查找meida_profiles.xml檔案,如果沒有找到該檔案就會進行預設的設定,預設的設定不會去設定前置攝像頭的編碼資訊。

解決方法:在media_profiles.xml檔案中加入前置攝像頭的編碼資訊。這個拷貝後置攝像頭的部分即可,但是要記住設定cameraId。

繼續閱讀