2013-05-31 348 views
3

我試圖從自定義相機活動拍攝照片時獲取設備方向。 以前,我在任何地方檢查瞭如何實現它,並沒有得到任何解決方案的結果。getDefaultDisplay()。getRotation();返回始終相同的值

我正在使用這一行代碼檢索沒有結果的方向。它總是返回1.如果有幫助,我將使用Samsung Galaxy S III進行開發。

int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
    Log.d(TAG, "Taken rotation " + rotation); 
    DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int width = dm.widthPixels; 
    int height = dm.heightPixels; 
    int orientation; 
    // if the device's natural orientation is portrait: 
    if ((rotation == Surface.ROTATION_0 
      || rotation == Surface.ROTATION_180) && height > width || 
     (rotation == Surface.ROTATION_90 
      || rotation == Surface.ROTATION_270) && width > height) { 
     switch(rotation) { 
      case Surface.ROTATION_0: 
       orientation = 0; 
       break; 
      case Surface.ROTATION_90: 
       orientation = 90; 
       break; 
      case Surface.ROTATION_180: 
       orientation =180; 
       break; 
      case Surface.ROTATION_270: 
       orientation = 270; 
       break; 
      default: 
       Log.e(TAG, "Unknown screen orientation. Defaulting to " + 
         "portrait."); 
       orientation = 0; 
       break;    
     } 
+0

也許您將活動限制爲橫向方向?也許你將手機設置爲鎖定屏幕方向? –

+0

感謝您的回答。我事先檢查了它,因爲我將它設置爲相機佈局的橫向。我退出了它,而不是讓我回來1一直是0。這就是我爲什麼要把它扔到這裏的原因 – datienza

+0

也許我不正確地理解你。當您將活動鎖定到橫向時,您將只能從WindowManager接收橫向旋轉。如果鎖定到人像,您只會收到人像旋轉。即使方向鎖定,您也可以檢查有關歐拉天使的加速度計。 –

回答

-1

這是根據我所知道的猜測,但我在想Surface.ROTATION_90是一個常量整數名稱。在程序的開始

final int Surface.ROTATION_0 = 0; 
final int Surface.ROTATION_90 = 1; 
final int Surface.ROTATION_180 = 2; 
final int Surface.ROTATION_270 = 3; 

:想想這就像這一點。當預編譯器看到這些常量中的一個時,它會自動用等效整數替換它。當你初始化你是int旋轉並將其設置爲其中的一個時,int保存常量已經初始化的值。 所以,如果你想直接檢查Surface.Rotation,你可能需要在每次檢查時調用getRotation()。

喜歡的東西:

Display display = getWindowManager().getDefaultDisplay(); 
if(display.getRotation() == Surface.ROTATION_0) 
    { 
     //whatever you need to do here 
    } 

,或者你可以簡單地檢查這些常量評價爲整數。

int rotation = getWindowManager().getDefaultDisplay().getRotation; 
if(rotation == 0) 
    { 
     //whatever you need to do here 
    } 

個人而言,我會選擇第二個選項去。不必爲每個檢查調用getRotation可能意味着運行時的小改進,但是它儘可能減少處理器使用的好習慣。