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);
}

но здесь при первом запуске экран переворачивается, но вы можете применить это в соответствии с вашими требованиями.

Пожалуйста, предоставьте более подробную информацию о том, что вы хотите достичь

Другие вопросы по тегам