Это решение основано только на других.Это другой способ решения проблемы, с которой сейчас сталкиваются: на некоторых устройствах ландшафт равен ROTATION_90
, а на некоторых (несколько) - ROTATION_270
.Когда я попробовал что-то вроде решения inv8enmentnow на Kindle Fire HD 7 ", он заставил экран вращаться вверх ногами, а затем сразу назад. Я не видел других идей, кроме как жестко кодировать, какие устройства считают ландшафт равным 270, так что вотжестко запрограммированное решение:
public static void unlockOrientation() {
activity.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
public static void lockOrientation() {
if (Build.VERSION.SDK_INT < 18) {
activity.setRequestedOrientation(getOrientation());
} else {
activity.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}
}
private static int getOrientation() {
int port = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
int revP = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
int land = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
int revL = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
if (Build.VERSION.SDK_INT < 9) {
revL = land;
revP = port;
} else if (isLandscape270()) {
land = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
revL = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
}
Display display = activity.getWindowManager().getDefaultDisplay();
boolean wide = activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
switch (display.getRotation()) {
case Surface.ROTATION_0:
return wide ? land : port;
case Surface.ROTATION_90:
return wide ? land : revP;
case Surface.ROTATION_180:
return wide ? revL : revP;
case Surface.ROTATION_270:
return wide ? revL : port;
default:
throw new AssertionError();
}
}
private static boolean isLandscape270() {
return android.os.Build.MANUFACTURER.equals("Amazon")
&& !(android.os.Build.MODEL.equals("KFOT") || android.os.Build.MODEL.equals("Kindle Fire"));
}
isLandscape270()
определяет, является ли устройство Kindle 2-го поколения или новее (см. эту ссылку , получая MODEL
от этогоссылка ). Я не знаю, должны ли быть включены и другие устройства, пожалуйста, прокомментируйте, если вам что-то известно.
Кроме того, для API> = 18 просто используется setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED)
. Я только проверялчто на эмуляторах, пожалуйста, прокомментируйте, если у него есть проблемы на реальных устройствах.