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

15
demandé sur kagronick 2013-01-29 20:05:02

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 .

22
répondu chrispaton 2013-02-13 20:49:59

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);
14
répondu kagronick 2013-02-01 20:17:31

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.)

  1. accorder l'accès à paramètres du système ( WRITE_SETTINGS ) dans AndroidManifest.xml

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
  2. importation Settings

    import android.provider.Settings;
    
  3. assurer auto-rotation de l'écran Android est désactivé

    Settings.System.putInt(
        getContentResolver(),
        Settings.System.ACCELEROMETER_ROTATION,
        0
    );
    
  4. ensemble USER_ROTATION au réglage désiré, qui devrait être l'un des ROTATION_ 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.

11
répondu Sam 2015-04-26 04:43:01

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.

  1. 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" />
    
  2. 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:

Instructions

  1. créer un View .
  2. créer un WindowManager.LayoutParams .
    1. Set type à la valeur que vous avez choisi ci-dessus.
    2. Zero son width et height à 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.)
    3. définit sa screenOrientation à n'importe quel valeur d'orientation que vous voulez.

exemple

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

}
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

2
répondu Sam 2016-12-10 05:16:27

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.

-4
répondu Booger 2013-01-29 17:02:13