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的線程返回狀態。xml

3:)前置拍照能夠用了,可是當切換到攝像的時候,進程回死掉。接口

產生緣由攝像最終存儲成3GP或者mp4文件是須要編碼去進行編碼的。而這些信息是有MeidaProfiles.cpp文件進行控制的。改類回在初始化時,會去/etc下查找meida_profiles.xml文件,若是沒有找到該文件就會進行默認的設置,默認的設置不會去設置前置攝像頭的編碼信息。進程

解決方法:在media_profiles.xml文件中加入前置攝像頭的編碼信息。這個拷貝後置攝像頭的部分便可,可是要記住設置cameraId。get

相關文章
相關標籤/搜索