Как переключить блокировку ориентации в Android?

Я хочу создать флажок в моей настройке "Активность", которая позволяет пользователю переключать ориентацию.

В подобных вопросах люди пишут только о полной блокировке ориентации (путем переопределения методаConfigurationChanged или добавления configChanges в AndroidManifest.xml) или обеспечения ориентации (посредством setRequestedOrientation).

Есть ли способ переключить блокировку ориентации?


EDIT: Я создал метод, который устанавливает предпочтительную ориентацию в одно из трех состояний: пейзаж, портрет и датчик. Этот метод используется в сочетании с извлечением ориентации getResources().getConfiguration().orientation) и сохранением выбранной ориентации в предпочтениях. Затем в активности, которая должна блокировать ориентацию, я запускаю этот метод с предпочтительной ориентацией от предпочтений.

private static void setActivityOrientation(Activity activity, int preferenceOrientation) {
    if (preferenceOrientation == Configuration.ORIENTATION_LANDSCAPE) { 
        if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){ 
        // You need to check if your desired orientation isn't already set because setting orientation restarts your Activity which takes long
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    } else if (preferenceOrientation == Configuration.ORIENTATION_PORTRAIT) {
        if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }    
    } else {
        if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_SENSOR){
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
        }
    }
}

Ответ 1

Я не понимаю, в чем проблема с setRequestedOrientation.

SCREEN_ORIENTATION_SENSOR объединяется с пейзажем или портретом, как вы хотите, нет?

if(....)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
else if(....)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if(....)
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);