Как я могу глобально настроить ориентацию экрана в Android?
Существует множество приложений, которые могут принудительно принудительно поворачивать экран. Они работают, даже если приложение явно хочет, чтобы их просматривали в другой ориентации. Прямо сейчас я отключил настройку системы вращения акселерометра и установил свою предпочтительную ориентацию. Приложение все еще может переопределить это.
Вот одно из приложений, которое может переопределить запрошенную ориентацию приложения:
https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en
Ответы
Ответ 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
В стороне, вы также можете глобально изменить ориентацию экрана, не форсируя его в неподдерживаемых приложениях. (Я знаю, что этот вопрос касается переопределения предпочтений приложений, но это по-прежнему полезно и в основном актуальная информация.)
-
Предоставить доступ к системным настройкам (WRITE_SETTINGS
) в AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
-
Импорт Settings
import android.provider.Settings;
-
Убедитесь, что Автоматическое вращение экрана Android отключено
Settings.System.putInt(
getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION,
0
);
-
Установите USER_ROTATION
требуемую настройку, которая должна быть одной из ROTATION_
константы. Эти значения представляют собой повороты экрана из естественной ориентации устройства, которые могут быть как ландшафтными, так и портретными.
Settings.System.putInt(
getContentResolver(),
Settings.System.USER_ROTATION,
Surface.ROTATION_0 //Or a different ROTATION_ constant
);
Обратите внимание, что изменения в USER_ROTATION
сохраняются, даже если ваше приложение не запущено или не удалено. Если я правильно помню, пользователи могут reset это значение вручную отключить и включить автоматическое вращение.
Ответ 4
Создание системного представления
Создайте невидимый View
, который всегда отображается поверх других приложений. View
может указывать свои собственные предпочтения ориентации, поэтому ориентация вашего представления может использоваться для переопределения ориентации основных видов и приложений.
Функции
Мне известно о нескольких разных типах представлений, которые вы можете использовать для достижения этого, каждый со своими недостатками.
Инструкции
- Создайте
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, я предлагаю вам сделать некоторые поиски.