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?
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é.
Une approche simple serait d'utiliser
getResources().getConfiguration().orientation
1 est pour Portrait et 2 pour Paysage.
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;
}
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;
}
}
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.)
Vous pouvez le faire d'une manière très simple: obtenez l'écran widht
et 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();
}