2014-08-29 109 views
0

後獲得設備的方向我想獲得設備的方向,理論上應該工作中使用此:Android的 - 拍照

getActivity().getResources().getConfiguration().orientation; 

但是我注意到,有時,我一直在使用這個代碼調用相機後:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
fileUri = getOutputMediaFile(1); // create a file to save the image 
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name 
// start the image capture Intent 
intent.putExtra(GlobalDefines.IMAGE_NR, 1); 
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_1); 

後,我已經拍攝的圖像,當我試圖讓在onActivityResult設備的方向(拍攝照片後,被稱爲)設備的方向規定「風景」模式,雖然我拍的照片中肖像模式,並保持該設備在肖像模式下。

奇怪的是,這隻發生在10次左右的3次。看起來,在拍攝照片時,設備方向會在內部更改爲「橫向模式」(即使圖像是以縱向模式拍攝的),並且在拍攝照片後,需要一段時間,直到設備意識到它處於縱向模式。

我該怎麼辦?

+0

您最好使用圖像方向,因爲某些設備+相機程序執行奇怪的方向更改。 – 2014-08-29 13:59:46

+0

是的,我注意到了,這就是爲什麼我想知道設備方向(需要更長時間才能解釋爲什麼),主要問題是我的exif圖像數據似乎也很奇怪...... – deimos1988 2014-08-29 14:01:12

+1

某些設備沒有寫入EXIF數據。您必須從'MediaStore.Images.ImageColumns.ORIENTATION'檢查方向。無論如何,我總是檢查級聯中的所有方向:MediaStore,EXIF,設備。 – 2014-08-29 14:06:03

回答

3

如果設備未寫入可靠的EXIF方向,則可能是由方向傳感器(加速度計)的硬件問題引起的。如果是這種情況,檢查應用中的方向是沒有意義的。

我可以解釋爲什麼有時候您的活動在通過Intent拍攝照片後不會報告onActivityResult()中的正確(人像)方向,以及如何以更穩健的方式檢測到此方向。但不幸的是,這將是徒勞的。

當應用程序從相機應用程序接收控制權時,您不能依賴設備的方向,因爲在最終用戶實際拍攝照片後,她會預覽照片,可能會再次嘗試,最後接受(或拒絕)照片。在所有這些在捕獲之後的漫長過程期間,終端用戶可能有意識地或無意識地旋轉設備多次。所以,如果你不能依靠EXIF的方向,但可以依靠設備傳感器,你別無選擇,只有use a Camera object,在你的應用程序內拍照。

現在,爲了記錄,這裏是我在第二段中提到的解釋大綱。

當您的應用收到onActivityResult()回調時,可能會在您的活動被系統銷燬(爲相機應用釋放更多內存)後發生。您無法控制是否會發生這種情況,但您可以知道是否將控制返回給您的應用程序。

在這種情況下,您的活動將不知道其方向。它稍後確定此方向,即在onResume()回調之前。因此,在onActivityResult()以內時,您不能盲目依賴活動方向。您應該直接讀取加速度傳感器,並計算方向是橫向還是縱向(請參閱OrientationEventListener)。

不幸的是,這只是一個理論選項,正如我上面所解釋的。幸運的是,當您使用自定義相機時,您可以在活動中簡單地使用上述OrientationEventListener類來可靠地確定方向(至HW傳感器可靠)。

+0

非常感謝您的回答。但是你說我應該實現我自己的相機,而不是使用外部應用程序,對不對? – deimos1988 2014-09-01 08:15:08

+0

我會先試着理解爲什麼EXIF標誌不起作用。此外,證明HW傳感器工作正常非常重要。但是你是對的,我的回答總結如下:如果你不能依靠EXIF方向,但可以依靠設備傳感器,你別無選擇,只能使用Camera對象,在你的app_中拍照。 – 2014-09-01 08:44:46

+0

您所說的關於銷燬活動以釋放相機內存可能是導致行爲不一致的原因。我改變了一些設置,所以使用較少的內存,不知道它是否會像這樣永遠工作。 我正在顯示在Dialogfragment中拍攝的圖片 - 可能是在獲取設備方向之前等待0.5秒,然後顯示帶有該圖像的DialogFragment的可能性? – deimos1988 2014-09-01 11:12:29