web-dev-qa-db-fra.com

Comment obtenir l'orientation ACTUELLE (ActivityInfo.SCREEN_ORIENTATION_ *) d'un appareil Android Android?

Je souhaite connaître l'orientation détaillée d'un appareil, de préférence l'un des SCREEN_ORIENTATION_LANDSCAPE, SCREEN_ORIENTATION_PORTRAIT, SCREEN_ORIENTATION_REVERSE_LANDSCAPE, SCREEN_ORIENTATION_REVERSE_PORTRAIT de ActivityInfo ou équivalent.

Certaines des réponses ici sur StackOverflow inclus

getWindowManager().getDefaultDisplay().getRotation()

mais cela ne me dit pas vraiment si l'appareil est en mode portrait ou paysage, mais seulement comment il est tourné par rapport à sa position naturelle - qui à son tour peut être paysage ou portrait en premier lieu.

getResources().getConfiguration().orientation

renvoie l'un des trois suivants: ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT, ORIENTATION_SQUARE, qui ne me dit alors pas vraiment dans quel sens le téléphone est tourné (que ce soit à l'envers ou vers quel côté il est tourné).

Je sais que je pourrais utiliser ce dernier en combinaison avec DisplayMetrics pour connaître l'orientation naturelle de l'appareil, mais n'y a-t-il vraiment pas de meilleur moyen?

56
Zoltán

J'ai fini par utiliser la solution suivante:

private int getScreenOrientation() {
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    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 = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_180:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            case Surface.ROTATION_270:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
            default:
                Log.e(TAG, "Unknown screen orientation. Defaulting to " +
                        "portrait.");
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;              
        }
    }
    // if the device's natural orientation is landscape or if the device
    // is square:
    else {
        switch(rotation) {
            case Surface.ROTATION_0:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_180:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
            case Surface.ROTATION_270:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            default:
                Log.e(TAG, "Unknown screen orientation. Defaulting to " +
                        "landscape.");
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;              
        }
    }

    return orientation;
}

NOTE : Certains utilisateurs (Geltrude et holtaf dans les commentaires ci-dessous) ont souligné que cette solution ne fonctionnera pas sur tous les appareils comme sens de rotation par rapport à l'orientation naturelle n'est pas standardisé.

89
Zoltán

Une approche simple serait d'utiliser

getResources().getConfiguration().orientation

1 est pour Portrait et 2 pour Paysage.

21
Nilesh
public static int getScreenOrientation(Activity activity) {
        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        int orientation = activity.getResources().getConfiguration().orientation;
        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
          if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) {
            return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
          } else {
            return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
          }
        }
        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
          if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
          } else {
            return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
          }
        }
        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
      }
15
Uma sankar pradhan

Je pense que votre problème est que vous pouvez détecter le paysage et le portrait mais pas inverser le paysage et inverser le portrait car ils ne sont pas pris en charge dans les anciennes versions. Pour détecter ce que vous pouvez faire, vous pouvez utiliser à la fois l’orientation et la rotation. Je vous donne une idée qui peut vous être utile.

essayez cela, je pense que cela peut résoudre votre problème.

            int orientation = getResources().getConfiguration().orientation;
            int rotation = getWindowManager().getDefaultDisplay().getRotation();
            int actual_orientation = -1;
            if (orientation == Configuration.ORIENTATION_LANDSCAPE
            &&  (rotation == Surface.ROTATION_0 
            ||  rotation == Surface.ROTATION_90)){
                orientation = Configuration.ORIENTATION_LANDSCAPE;
            } else if (orientation == Configuration.ORIENTATION_PORTRAIT
                  &&  (rotation == Surface.ROTATION_0 
                   ||  rotation == Surface.ROTATION_90)) {
                orientation = Configuration.ORIENTATION_PORTRAIT;
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE
                  &&  (rotation == Surface.ROTATION_180 
                   ||  rotation == Surface.ROTATION_270)){
                orientation = //any constant for reverse landscape orientation;
            } else {
                if (orientation == Configuration.ORIENTATION_PORTRAIT
                        &&  (rotation == Surface.ROTATION_180 
                         ||  rotation == Surface.ROTATION_270)){
                      orientation = //any constant for reverse portrait orientation;
                }
            }
7
Bharat Sharma

getResources().getConfiguration().orientation est le moyen standard de connaître l'orientation actuelle utilisée. Cependant, s'il ne répond pas à vos besoins, vous pouvez peut-être utiliser des capteurs pour le calculer en termes d'angle. Lire ce et ce

7
waqaslam

J'ai fini par utiliser la réponse de Zoltán ci-dessus, qui fonctionne très bien, sauf quand je l'ai essayé sur une tablette (un Samsung P6210 Galaxy Tab 7.0 Plus). En mode portrait, il a renvoyé SCREEN_ORIENTATION_REVERSE_PORTRAIT. Donc, dans l'instruction else (si l'orientation naturelle est paysage), j'ai échangé les cas pour ROTATION_90 et ROTATION_270, et tout semble bien fonctionner. (Je n'ai pas assez de réputation pour poster ceci en tant que commentaire à la réponse de Zoltán.)

2
pfalstad

Vous pouvez le faire d'une manière très simple: obtenez l'écran widhtet height. la largeur de l'écran sera toujours plus élevée lorsque l'appareil est en orientation paysage.

Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth(); 
    int height = display.getHeight();
    Toast.makeText(getApplicationContext(), "" + width + "," + height,
            Toast.LENGTH_SHORT).show();
    if (width > height) {
        Toast.makeText(getApplicationContext(), "LandScape",
                Toast.LENGTH_SHORT).show();
    }
1
Aby Mathew