騰訊優測優分享 | Android適配中的一些特殊狀況小結

騰訊優測是專業的自動化測試平臺,提供全面兼容適配測試,遠程真機租用等多維度的測試服務!
做爲一名「堅苦卓絕」的軟件工程師,我在開發路上常常被各類奇葩狀況虐的體無完膚。。。今天就想與你們分享一個我在適配過程當中遇到的特殊情況,但願工程師們多加註意。
愛護程序猿,人人有責。阿門。。。android

閒話很少說,步入正題。相信你們都用過 android.hardware.Camera,那就必定接觸過Camera的 setDisplayOrientation方法。該方法是用來設置顯示Camera在預覽狀態下的順時針旋轉度,關於這個修正角度的計算,官方文檔有個範例:測試


在這個例子中,CameraInfo很是重要,最終的角度計算就是根據CameraInfo中orientation 值獲得的。因此,若是這個值不許確的話,咱們的角度就有可能出現錯誤。
我在作某款產品的適配時遇到一個奇怪的現象,在使用VIVO V1手機打開該產品時,首次打開掃描二維碼功能,預覽畫面的角度正常,可是退出再進來的時候角度就偏轉了90度。通過反覆測試後,我找到了一個規律:只有重啓手機後,第一次進入該頁面時畫面的角度纔是正常的。
經過一系列的log調查,我發現當第一次應用此款手機獲取CameraInfo的orientation值是90。而當我執行了mCamera = Camera.open();以後再獲取CameraInfo的orientation值時就是0,並且之後獲取的都是0。除非咱們重啓手機,不然都沒有變化。
那麼有人就會說,咱們能夠第一次獲取orientation後將值保存到本地,之後讀取本地數據就能夠了。剛開始我也有這樣的想法,但狀況遠非如此簡單。當我重啓手機後打開系統的照相機功能,以後再獲取CameraInfo的orientation結果依舊是0。
也就是說,不管是這款手機上的哪一個應用,只要執行了一次Camera.open()以後,其餘全部程序中獲取CameraInfo的orientation都是0,因此這個解決方案是不可行的。
但問題在於,雖然出現了上述狀況,但手機自帶的相機卻能很好的使用。因而我反編譯了VIVO V1的系統相機,果真,系統相機根本沒有使用CameraInfo的orientation來計算修正角度,他的角度計算方法以下:spa


mLastOrientation就是他最後用來設置修正角度的值:blog


access$2802的small代碼是這樣的:開發


roundOrientation方法:rem


因此,針對VIVO V1,咱們須要經過手機屏幕的旋轉角度來計算Camera成像的修正角度。目前尚未足夠的測試來證實這個方法是否通用,因此建議你們在使用時作好機型開關判斷。文檔

相關文章
相關標籤/搜索