2012-05-10 3 views
0

У меня есть некоторые проблемы с ориентацией экрана. В основном я пытаюсь определить точную ориентацию экрана (включая обратный пейзаж и обратный портрет). Я написал метод ниже, чтобы сделать это для меня, и, похоже, он отлично работает на моем Transformer, однако, когда я запускаю тот же код на эмуляторе, некоторые вещи запутаны.Определить ориентацию экрана в Android 2.2+

В основном то, что происходит в эмуляторе, я переключаюсь на пейзаж (ROTATION_90) в соответствии с документацией, он должен быть обратным пейзажем (и, например, на Transformer с ROTATION_90 устройство находится в обратном портрете, как описано в документации для Android). К сожалению, на эмуляторе почему-то кажется нормальным ландшафтным режимом.

Так что мой вопрос в том, что этот код ниже правильной проблемы. Или, возможно, я не принимаю во внимание некоторые другие параметры (например, эмулятор имеет едва акселерометр, например).

public static int getDeviceCurrentOrientation() { 

    WindowManager lWindowManager = (WindowManager) getContext() 
      .getSystemService(Activity.WINDOW_SERVICE); 

    Configuration cfg = getContext().getResources().getConfiguration(); 
    int lRotation = lWindowManager.getDefaultDisplay().getRotation(); 

    int rotation1; 
    int orientation; 

    rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 
    if (cfg.orientation == Configuration.ORIENTATION_LANDSCAPE) 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
    else if (cfg.orientation == Configuration.ORIENTATION_PORTRAIT) 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    else 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 

    switch (lRotation) { 
    case Surface.ROTATION_0: 
     orientation = 0; 
     break; 
    case Surface.ROTATION_90: 
     orientation = 1; 
     break; 
    case Surface.ROTATION_180: 
     orientation = 2; 
     break; 
    case Surface.ROTATION_270: 
     orientation = 3; 
     break; 
    default: 
     orientation = -1; 
    } 

    if ((orientation == 0) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 

    if ((orientation == 0) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

    if ((orientation == 1) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 

    if ((orientation == 1) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 

    if ((orientation == 2) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 

    if ((orientation == 2) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 

    if ((orientation == 3) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

    if ((orientation == 3) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 

    return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 
} 
+0

я, вероятно, следует также добавить, что я знаю, что я испортил с именами ориентации и ротации переменные :-) Также и эмулятор, и мой планшет работают с Android 4.0.3 – alter83

+0

Хорошо, на эмуляторе я только что попробовал API 8 и API 10. С 2.2 на эмуляторе этот код работал, как и предполагалось, однако 2.3.3 вызвал те же проблемы – alter83

+0

You haven 't сказал нам, какое сообщение об ошибке вы получаете. Что такое вывод logcat? –

ответ

2

У меня была аналогичная проблема, и после нескольких часов хруст ......
я нашел this nice solution >>

Display display = getWindowManager().getDefaultDisplay(); 
int rotation = display.getRotation(); 

Point size = new Point(); 
display.getSize(size); 

int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

if (rotation == Surface.ROTATION_0 
     || rotation == Surface.ROTATION_180) { 
    // if rotation is 0 or 180 and width is greater than height, we have 
    // a tablet 
    if (size.x > size.y) { 
     if (rotation == Surface.ROTATION_0) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     } 
    } else { 
     // we have a phone 
     if (rotation == Surface.ROTATION_0) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 
    } 
} else { 
    // if rotation is 90 or 270 and width is greater than height, we 
    // have a phone 
    if (size.x > size.y) { 
     if (rotation == Surface.ROTATION_90) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     } 
    } else { 
     // we have a tablet 
     if (rotation == Surface.ROTATION_90) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     } 
    } 
}