android:screenOrientation屬性
- unspeciied, 默認(rèn)值 由系統(tǒng)決定,不同的手機(jī)可能不同
- behind 與前一個(gè)Activity方向一致
- landscape 強(qiáng)制橫屏(手機(jī)自然位置右側(cè)向上)
- portrait 強(qiáng)制豎屏(手機(jī)自然位置)
- sensor 隨著設(shè)備的旋轉(zhuǎn)而旋轉(zhuǎn),但是一般手機(jī)不會(huì)4個(gè)方向都旋轉(zhuǎn)
- fullSensor 4個(gè)方向都會(huì)旋轉(zhuǎn)
- nosensor 方向傳感器被忽略,頁面不會(huì)根據(jù)手機(jī)旋轉(zhuǎn)而發(fā)生改變
- user 用戶自己設(shè)定
其他可自行查看官方文檔
引言
當(dāng)我們自定義相機(jī)APP的時(shí)候,Camera不設(shè)置setDisplayOrientation,APP頁面也不設(shè)置屏幕方向時(shí),所得圖像。

相機(jī)傳感器的方向
Suppose a back-facing camera sensor is mounted inlandscape and the top side of the camera sensor is aligned with the right edge of the display in natural orientation
假設(shè)后置相機(jī)的傳感器是被水平安裝的,并且相機(jī)傳感器的頂部與自然狀態(tài)下手機(jī)的右邊緣對(duì)齊。
這也就是為什么我們橫放手機(jī)(右側(cè)向上時(shí))拍的照片和我們?nèi)庋劭吹降姆较蛞恢隆?/p>
預(yù)覽的方向
如果我們想要在手機(jī)不同的旋轉(zhuǎn)角度上,得到的預(yù)覽圖像都和我們?nèi)庋鬯姷囊恢?,則需要旋轉(zhuǎn)preview frames,所用的方法是setDisplayOrientation 設(shè)置的角度官方文檔也有詳細(xì)的解釋
官方文檔解釋

上述情況都是,手機(jī)屏幕可以隨著手機(jī)放置的位置旋轉(zhuǎn)而改變的情況。但是我們手機(jī)APP一般都是豎屏或者橫屏固定的。這種情況是什么樣的呢?
當(dāng)我們固定屏幕時(shí),旋轉(zhuǎn)的角度也就固定,無論我們?cè)趺礃臃D(zhuǎn)屏幕,拍到的圖像方向一致,preview時(shí)旋轉(zhuǎn)的角度也就一定的。
生成圖片的方向
setDisplayOrientation只改變預(yù)覽圖像的方向,不會(huì)改變圖像本身的方向,所以我們?cè)诒4娴臅r(shí)候,需要旋轉(zhuǎn)圖像角度來得到正確方向的照片
- 方法1:
通過圖片矩陣旋轉(zhuǎn)得到一個(gè)新的bitmap, 旋轉(zhuǎn)角度即為我們預(yù)覽時(shí)旋轉(zhuǎn)的角度。 需要加載到內(nèi)存,處理大圖片時(shí),如果系統(tǒng)內(nèi)存不足,容易閃退
- 方法2:
通過ExifInterface來設(shè)置方向,但是該類只支持
JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW and RAF.
不支持png
這種方式,不能真正改變圖片的屬性,加載到ImageView的時(shí)候,還是需要做矩陣旋轉(zhuǎn)
- 方法3:
設(shè)置Camera的parameters的setRotation() 該方法影響的是通過pictureCallback返回的圖片,即我們所得到的byteArray方向就是翻轉(zhuǎn)正確的了。
這種方法得到的圖片矩陣就直接是正確的,后續(xù)不需要再做額外的旋轉(zhuǎn)處理了
官方文檔解釋
但是這里有一個(gè)問題,如果手機(jī)應(yīng)該是豎屏,我們?cè)O(shè)置了相應(yīng)的旋轉(zhuǎn)角度,但我們?nèi)绻麢M屏拍照的時(shí)候圖片也是翻轉(zhuǎn)了相同的角度,則我們得到圖片,就不是一個(gè)正的像,而需要我們橫屏看時(shí),是正的像。那么這樣就有問題了。
發(fā)現(xiàn)個(gè)奇葩的問題,我用小米note測(cè)試的時(shí)候,使用setRotation不會(huì)改變ExifInterface的方法,但是用三星S7和小米mix2時(shí)發(fā)現(xiàn)是改變了,在用ImageView去顯示時(shí),還需要旋轉(zhuǎn)相應(yīng)的角度
總結(jié):
當(dāng)然我們監(jiān)聽屏幕的旋轉(zhuǎn)OrientationEventListener操作,可以在拍照之前實(shí)時(shí)設(shè)置設(shè)置Camera的parameters的setRotation(),也可以通過ExifInterface來設(shè)置方向,實(shí)現(xiàn)保存正確方向的圖片
顯示圖片
它是按照?qǐng)D片矩陣的排列方式來顯示的。上面講述的通過ExifInterface做過旋轉(zhuǎn)處理,則展示的時(shí)候需要再次旋轉(zhuǎn),但如果直接作用于圖片矩陣排列的話,則直接展示即可