Подтвердить что ты не робот

Как я могу глобально настроить ориентацию экрана в Android?

Существует множество приложений, которые могут принудительно принудительно поворачивать экран. Они работают, даже если приложение явно хочет, чтобы их просматривали в другой ориентации. Прямо сейчас я отключил настройку системы вращения акселерометра и установил свою предпочтительную ориентацию. Приложение все еще может переопределить это.

Вот одно из приложений, которое может переопределить запрошенную ориентацию приложения:

https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en

4b9b3361

Ответ 1

Это можно сделать, создав скрытый системный диалог. Это своего рода хак, но его сумасшедший достаточно, чтобы работать.

    wm = (WindowManager) content.getSystemService(Service.WINDOW_SERVICE);

    orientationChanger = new LinearLayout(content);
    orientationChanger.setClickable(false);
    orientationChanger.setFocusable(false);
    orientationChanger.setFocusableInTouchMode(false);
    orientationChanger.setLongClickable(false);

    orientationLayout = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
            windowType, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.RGBA_8888);

    wm.addView(orientationChanger, orientationLayout);
    orientationChanger.setVisibility(View.GONE);

    orientationLayout.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    wm.updateViewLayout(orientationChanger, orientationLayout);
    orientationChanger.setVisibility(View.VISIBLE);

Ответ 2

Я попробовал ответить kagronick, но не смог заставить его работать. Немного поработав, я в конечном итоге получил его работу с использованием окна оверлея системы и удаление найденных мною LayoutParams было ненужным. Здесь мое возможное решение:

orientationChanger = new LinearLayout(this);
// Using TYPE_SYSTEM_OVERLAY is crucial to make your window appear on top
// You'll need the permission android.permission.SYSTEM_ALERT_WINDOW
WindowManager.LayoutParams orientationLayout = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 0, PixelFormat.RGBA_8888);
// Use whatever constant you need for your desired rotation
orientationLayout.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;

WindowManager wm = (WindowManager) this.getSystemService(Service.WINDOW_SERVICE);
wm.addView(orientationChanger, orientationLayout);
orientationChanger.setVisibility(View.VISIBLE);

Вы можете увидеть мой успех в приложении, которое я выпустил на основе этого: Force Dock Rotation.

Ответ 3

В стороне, вы также можете глобально изменить ориентацию экрана, не форсируя его в неподдерживаемых приложениях. (Я знаю, что этот вопрос касается переопределения предпочтений приложений, но это по-прежнему полезно и в основном актуальная информация.)

Обратите внимание, что изменения в USER_ROTATION сохраняются, даже если ваше приложение не запущено или не удалено. Если я правильно помню, пользователи могут reset это значение вручную отключить и включить автоматическое вращение.

Ответ 4

Создание системного представления

Создайте невидимый View, который всегда отображается поверх других приложений. View может указывать свои собственные предпочтения ориентации, поэтому ориентация вашего представления может использоваться для переопределения ориентации основных видов и приложений.

Функции

Мне известно о нескольких разных типах представлений, которые вы можете использовать для достижения этого, каждый со своими недостатками.

  • Окно системного оверлея (TYPE_SYSTEM_OVERLAY)

    Требуется разрешение SYSTEM_ALERT_WINDOW. (Добавьте следующее в AndroidManifest.xml.)

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
  • Окно тоста (TYPE_TOAST)

    Не требуется разрешение, за исключением MIUI V8.

    Не отображается над некоторыми типами окон, поэтому их ориентация не может быть затронута:

Инструкции

  • Создайте View.
  • Создайте WindowManager.LayoutParams.
    • Установите type, чтобы вы выбрали выше.
    • Отменить его width и height для предотвращения проблем с приложениями, которые не будут работать при перекрытии. (Например, Android не позволит вам нажать кнопку "ОК", когда вы пытаетесь включить службу доступности, если над ней находится окно.)
    • Установите screenOrientation в зависимости от значение ориентации вы хотите.

Пример

Реализация
public class ScreenOrientationEnforcer {

    private final View view;
    private final WindowManager windows;

    public ScreenOrientationEnforcer(Context context) {
        windows = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        view = new View(context);
    }

    public void start() {
        WindowManager.LayoutParams layout = generateLayout();
        windows.addView(view, layout);
        view.setVisibility(View.VISIBLE);
    }

    public void stop() {
        windows.removeView(view);
    }

    private WindowManager.LayoutParams generateLayout() {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        //So we don't need a permission or activity
        //Note that this won't work on some devices running MIUI
        layoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;

        //Just in case the window type somehow doesn't enforce this
        layoutParams.flags =
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

        //Prevents breaking apps that detect overlying windows enabling
        //(eg UBank app, or enabling an accessibility service)
        layoutParams.width = 0;
        layoutParams.height = 0;

        //Try to make it completely invisible
        layoutParams.format = PixelFormat.TRANSPARENT;
        layoutParams.alpha = 0f;

        //The orientation to force
        layoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

        return layoutParams;
    }

}
Применение
ScreenOrientationEnforcer screenOrientationEnforcer
    = new ScreenOrientationEnforcer(context);

//Force screen orientation
screenOrientationEnforcer.start();

//Stop forcing screen orientation
screenOrientationEnforcer.stop();

Недостатки

  • По моему опыту, вид может сохраняться, если ваше приложение выйдет из строя или будет убито. Кажется, что перезагрузка устройства работает вокруг этого.

Ссылки

Ответ 5

Вы можете установить ориентацию в своем AndroidManifest.xml. Вот так:

<activity android:name=".YourActivity"
              android:label="@string/your_app_name"
              android:screenOrientation="portrait">

Я не думаю, что вы можете установить его для всего приложения, но вам нужно будет установить его специально для каждого отображаемого вами Activity.

Много вопросов вроде этого на SO, я предлагаю вам сделать некоторые поиски.