Comment puis-je forcer globalement l'orientation de l'écran dans Android?
Il ya un certain nombre d'applications qui sont en mesure de forcer la rotation de l'écran. Ils fonctionnent même si une application veut explicitement être vue dans une autre orientation. En ce moment, je désactive le réglage du système de rotation de l'accéléromètre et je règle mon orientation préférée. Une application peut toujours annuler cette.
Voici une des applications qui est capable de passer outre l'orientation demandée par une application:
https://play.google.com/store/apps/details?id=nl.fameit.rotate&hl=en
5 réponses
j'ai essayé la réponse de kagronick mais je n'ai pas pu la faire fonctionner. Après avoir joué un peu, j'ai fini par le faire fonctionner en utilisant une fenêtre de superposition du système et en enlevant les paramètres de mise en page que j'ai trouvé inutiles. Voici ma solution éventuelle:
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);
vous pouvez voir mon succès dans l'application que j'ai publié basé sur ceci: Rotation de quai de Force .
cela peut être fait en créant un dialogue système caché. C'est un peu un piratage, mais c'est assez fou pour fonctionner.
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);
comme mise à part, vous pouvez également changer globalement l'orientation de l'écran sans le forcer dans les applications non supportées. (Je sais que cette question concerne les préférences des applications, mais c'est encore utile et surtout des informations pertinentes.)
-
accorder l'accès à paramètres du système (
WRITE_SETTINGS
) dans AndroidManifest.xml<uses-permission android:name="android.permission.WRITE_SETTINGS" />
-
importation
Settings
import android.provider.Settings;
-
assurer auto-rotation de l'écran Android est désactivé
Settings.System.putInt( getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0 );
-
ensemble
USER_ROTATION
au réglage désiré, qui devrait être l'un desROTATION_
constantes . Ces valeurs représentent les rotations de l'écran à partir de l'orientation naturelle de l'appareil, ce qui pourrait être soit paysage ou portrait.Settings.System.putInt( getContentResolver(), Settings.System.USER_ROTATION, Surface.ROTATION_0 //Or a different ROTATION_ constant );
notez que les changements à USER_ROTATION
persistent même si votre application n'est pas en cours d'exécution ou est désinstallée. Si je me souviens bien, les utilisateurs peuvent réinitialiser cette valeur en désactivant manuellement et en activant l'auto-rotation.
créer une vue système
créer un invisible View
qui affiche toujours sur le dessus d'autres applications. View
s peuvent spécifier leurs propres préférences d'orientation, de sorte que l'orientation de votre vue peut être utilisée pour outrepasser les orientations des vues sous-jacentes et des applications.
Options
je suis au courant d'un couple de différents types de vue que vous pouvez pour parvenir à cela, chacun avec ses propres inconvénients.
-
fenêtre de recouvrement du système (
TYPE_SYSTEM_OVERLAY
)nécessite la
SYSTEM_ALERT_WINDOW
permission. (Ajouter ce qui suit à AndroidManifest.xml .)<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-
fenêtre de Toast (
TYPE_TOAST
)Pas d'autorisation nécessaire, sauf sur MIUI V8 .
ne s'affiche pas sur certains types de fenêtres, de sorte que leurs orientations ne peuvent pas être affectées:
- dialogue D'appel entrant (
TYPE_PRIORITY_PHONE
) - rêves (
TYPE_DREAM
) - garde-Clé / Écran de verrouillage(
TYPE_KEYGUARD_DIALOG
,TYPE_KEYGUARD_SCRIM
)
- dialogue D'appel entrant (
Instructions
- créer un
View
. - créer un
WindowManager.LayoutParams
.- Set
type
à la valeur que vous avez choisi ci-dessus. - Zero son
width
etheight
à prévenir les problèmes avec les applications qui ne fonctionneront pas lorsque superposées. (Par exemple, Android ne vous laissera pas appuyer sur le bouton" OK " lorsque vous essayez d'activer un service d'accessibilité si une fenêtre est au-dessus de celui-ci.) - définit sa
screenOrientation
à n'importe quel valeur d'orientation que vous voulez.
- Set
exemple
Applicationpublic 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;
}
}
Utilisation
ScreenOrientationEnforcer screenOrientationEnforcer
= new ScreenOrientationEnforcer(context);
//Force screen orientation
screenOrientationEnforcer.start();
//Stop forcing screen orientation
screenOrientationEnforcer.stop();
désavantages
- D'après mon expérience, la vue pourrait persister si votre application tombe en panne ou est tuée. Redémarrer l'appareil semble fonctionner autour de cela.
Références
- correspondance entre les types de fenêtres et de l'ordre-z:
PhoneWindowManager.windowTypeToLayerLw
- Permissions requises pour chaque type de fenêtre:
PhoneWindowManager.checkAddPermission
vous pouvez définir l'orientation dans votre AndroidManifest.XML. Comme ceci:
<activity android:name=".YourActivity"
android:label="@string/your_app_name"
android:screenOrientation="portrait">
Je ne pense pas que vous puissiez le configurer pour l'application dans son ensemble, mais vous devrez le configurer spécifiquement pour chaque activité que vous affichez.
beaucoup de questions comme celle-ci sur Donc, je vous suggère de faire quelques recherches.