Android: Как принудительно изменить портретную ориентацию, даже если экран автоповорота устройства выключен?
Я работаю над приложением / игрой, которая должна переключаться между portrait
а также reversePortrait
в многопользовательском режиме. (Главным образом потому, что каждый игрок может использовать клавиатуру в свой ход, пока устройство находится на столе между ними.)
Мое приложение работает нормально, когда автоповорот включен.. Но reversePortrait
ориентация НИКОГДА не достижима, когда автоповорот устройства выключен!
То, что я сделал до сих пор, это то, что я установил ориентацию в Manifest
файл:
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
затем я изменяю ориентацию программно во время выполнения, вызывая этот метод при необходимости:
public void rotateScreen(boolean reverse){
if (reverse) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
Но это все еще не заставляет reversePortrait
ориентация, если устройство автоповорота выключено.
Я также попробовалonConfigurationChanged()
метод, но это не сработало. Я думаю, что это называется только ПОСЛЕ изменения ориентации уже, а не раньше!
Я даже пытался screenOrientation="reversePortrait"
в Manifest
файл, но даже это неэффективно, когда автоповорот выключен.
2 ответа
После многих исследований кажется, что единственный способ переопределить заблокированную ориентацию устройства и установить экран в вертикальную книжную ориентацию - принудительно включить автоповорот устройства.
Во-первых, необходимо добавить это разрешение в файл манифеста над тегом:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
затем определите что-то подобное в mainActivity:
public boolean enableAutoRotate(){
boolean isAutoRotate = android.provider.Settings.System
.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1) == 1;
if (!isAutoRotate){
try {
android.provider.Settings.System
.putInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1);
} catch (Exception e){
e.printStackTrace();
}
}
isAutoRotate = android.provider.Settings.System
.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 1) == 1;
return isAutoRotate;
}
Метод try and catch важен для предотвращения сбоя приложения, если пользователь не дал или не удалил разрешение.
затем, при необходимости, установите ориентацию, используя что-то вроде этого:
public void rotateScreen(boolean reverse){
if (enableAutoRotate()){
if (reverse) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
}
Метод rotateScreen также может быть логическим вместо void, если это необходимо.
Я не знаю, чего именно ты хочешь достичь. Вызовите свой метод в OnConfigurationChanged
@Override
public void onConfigurationChanged(Configuration newConfig) {
rotateScreen(true);
super.onConfigurationChanged(newConfig);
}
но здесь при первом запуске экран переворачивается, но вы можете применить это в соответствии с вашими требованиями.
Пожалуйста, предоставьте более подробную информацию о том, что вы хотите достичь