最近在調試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。