最近忙於項目中Camera的種種,由於大多數熱衷於交流的Android開發人員是在模擬器上進行開發,在涉及到硬體相關的實踐內容上,(例如此刻我將記錄的有關於Camera的變焦問題),網上可查詢和借鑒的資料真是少的可憐。不過想想也是,項目中具體硬體的相關資訊調試過程也不便公之於眾。我不寫細節,說說思路吧。
我所遇到的camera的變焦問題是這樣的:
zoom value 滿足於區間:[0,28],平均對應smooth zoom的效果是放大1倍到8倍。
我將smoothzoom 從*1 拖到 *8 的Log:
V/camera (30714): Zoom changed: value=1. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=2. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=3. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=4. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=5. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=7. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=8. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=10. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=12. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=15. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=18. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=21. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=24. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=28. stopped=true
D/camera (30714): ^_^ ZOOM_START
(注意:value=28不代表是28倍,而是8倍)
按上面的Log分析看來,邏輯十分錯亂,按道理說stopped參數為true時,zoom為停止。value 1-5的true值讓我費解。這個在真機上實際效果就是,在取景畫面中看到是a倍的情境,但是拍出的照片確實b倍的效果……
更為可怕的是,當自動化的測試zoom N個來回後,重複啟動camera,滿屏的I2C ERROR 告訴我camera掛掉了……如果找不出問題所在,我也要掛掉了……
Camera部分檔案量較大,同名也多,不得不先做個梳理,理清思路。
Camera.cpp的路徑我沒有寫,是有原因的。
對於上層應用來說,camera.cpp是最為直接的函數調用和實現,可以參考閱讀framework/base/libs/camera/Camera.cpp ,但是在硬體裝置確定的情況下,是根據硬體的功能具體實現整合到實際項目中的某一路徑的,習慣上來講放在hardware/下,至於怎麼編譯進來那是另外一方面的內容了。
啟動camera,首先對zoom進行初始化,如果硬體不支援zoom,那麼直接return了。
支援,使mSmoothZoomSupported置為true。
private void initializeZoom() { </p><p> if (!mParameters.isZoomSupported()) return; </p><p> // Maximum zoom value may change after preview size is set. Get the </p><p> // latest parameters here. </p><p> mParameters = mCameraDevice.getParameters(); </p><p> mZoomMax = mParameters.getMaxZoom(); </p><p> mSmoothZoomSupported = mParameters.isSmoothZoomSupported(); </p><p> mGestureDetector = new GestureDetector(this, new ZoomGestureListener()); </p><p> mCameraDevice.setZoomChangeListener(mZoomListener); </p><p> }<br />
對zoom狀態的監聽由class ZoomListener
|
implements android.hardware.Camera.OnZoomChangeListener { |
包辦,不同的zoom狀態標緻也是傳值給底層如何進行下一步的標緻
private void onZoomValueChanged(int index) { </p><p> if (mSmoothZoomSupported) { </p><p> if (mTargetZoomValue != index && mZoomState != ZOOM_STOPPED) { </p><p> mTargetZoomValue = index; </p><p> if (mZoomState == ZOOM_START) { </p><p> mZoomState = ZOOM_STOPPING; </p><p> mCameraDevice.stopSmoothZoom(); </p><p> } </p><p> } else if (mZoomState == ZOOM_STOPPED && mZoomValue != index) { </p><p> mTargetZoomValue = index; </p><p> mCameraDevice.startSmoothZoom(index); </p><p> mZoomState = ZOOM_START; </p><p> } </p><p> } else { </p><p> mZoomValue = index; </p><p> setCameraParametersWhenIdle(UPDATE_PARAM_ZOOM); </p><p> } </p><p> } </p><p>
當接到zoom改變訊號的時候
case CAMERA_MSG_ZOOM: </p><p> if (mZoomListener != null) { </p><p> mZoomListener.onZoomChange(msg.arg1, msg.arg2 != 0, mCamera); </p><p> } </p><p> return;<br />
其實拋開I2C的問題,僅僅明確這幾個操作就足以解決問題。今天實在太累了,下回接著寫好了 —_—||
歡迎驅動牛人多多交流camera I2C 方面的經驗。
作者:yiyaaixuexi 發表於2011-5-21 17:04:00 原文連結 閱讀:507 評論:14 查看評論