¿Hay una manera fiable para bloquear la orientación de la pantalla en todos los dispositivos Android? El siguiente código funciona para mi Nexus S y otros teléfonos, pero por alguna razón ROTATION_90 corresponde a SCREEN_ORIENTATION_REVERSE_PORTRAIT en el Xoom.

¿Hay alguna forma confiable la rotación del mapa de orientación?

private void lockScreenOrientation() {
    if (!mScreenOrientationLocked) {
        final int orientation = getResources().getConfiguration().orientation;
        final int rotation = getWindowManager().getDefaultDisplay().getOrientation();

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        }
        else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }

        mScreenOrientationLocked = true;
    }
}

private void unlockScreenOrientation() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    mScreenOrientationLocked = false;
}

EDIT: Este código está pensado para obtener la orientación actual y de bloqueo. La orientación está bloqueado temporalmente, y luego se libera para el usuario.

  • Wow, eso es un montón de código sólo para bloquear la orientación. Yo tenía una pantalla que necesitaba para bloquear la orientación, y todo lo que necesitaba era setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
  • El código de los bloqueos a la orientación actual, no arbitraria. El código funciona bien para todo, excepto de nido de abeja retrato. Yo podría codificar ese caso, pero no es una solución permanente, ya que los fabricantes de dispositivos pueden especificar cualquier rotación de la orientación de la combinación de varios de ellos deseo.
  • Me estoy enfrentando el mismo problema ahora mismo, y escribió casi exactamente lo mismo como el ejemplo de código y no funciona en mi Galaxy 10.1. Ha hecho ningún progreso desde la publicación de este?
  • Hay un montón de respuestas en MODO a esta pregunta, pero este es el único que he encontrado que funciona con el REVERSO orientaciones en pan de jengibre+
  • Por desgracia, esto sólo funciona para algunos dispositivos. Parece que hay algunos dispositivos donde la Rotación de los 90 es el natural «frente a» la orientación y la otra mitad de los dispositivos donde la Rotación de 270 es el natural «frente a» la orientación. Por ejemplo, esto se invierte la vista horizontal en el Kindle Fire HD.
  • Véase mi edición para que funcione en todos los dispositivos, se comprueba si la rotación ha cambiado.
  • stackoverflow.com/questions/42172864/…
  • Cuidado con SCREEN_ORIENTATION_SENSOR para desbloquear la orientación. Leer la documentación cuidadosamente: «Ignora la configuración de usuario para desactivar sensor de rotación». Tan verdad es esto lo que quieres? El desbloqueo puede ser mejor realizado con SCREEN_ORIENTATION_UNSPECIFIED en mi opinión

8 Comentarios

  1. 34

    Aquí está mi solución funciona en teléfonos y tabletas en cualquier Android SDK.

    switch (getResources().getConfiguration().orientation){
            case Configuration.ORIENTATION_PORTRAIT:
                if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO){
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    int rotation = getWindowManager().getDefaultDisplay().getRotation();
                    if(rotation == android.view.Surface.ROTATION_90|| rotation == android.view.Surface.ROTATION_180){
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
                    } else {
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    }
                }   
            break;
    
            case Configuration.ORIENTATION_LANDSCAPE:
                if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO){
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                } else {
                    int rotation = getWindowManager().getDefaultDisplay().getRotation();
                    if(rotation == android.view.Surface.ROTATION_0 || rotation == android.view.Surface.ROTATION_90){
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    } else {
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                    }
                }
            break;
        }
    • Esto funciona para mí. Tengo una Xoom y una Nexus 7 para realizar la prueba. El Xoom tiene una forma «natural» de la orientación de paisaje, por lo que el paisaje de la orientación de los valores es ROTATION_0. Es el retrato de la posición es ROTATION_270. La Nexus7 tiene un «natural» de la orientación de retrato, de modo que el retrato de orientación de valor es ROTATION_0, y es que la orientación horizontal es ROTATION_90.
    • Creo que debe ser la comparación de <= FROYO en lugar de simplemente < FROYO. INVERTIR los valores no están disponibles hasta que GINGERBREAD creo.
    • Mi gran temor es que estos valores pueden cambiar por dispositivo, por lo que no hay ninguna manera de hacerlo correctamente. Android es un desastre en este sentido. Es increíble que no hay una manera sencilla de que la orientación actual y luego configurar el dispositivo para que la misma orientación, sin gastar un día pensando cómo hacerlo y, a continuación, posiblemente no funcione correctamente, de todos modos.
    • +1 para demostrar que nadie debe esperar bloqueado invertir orientaciones <= FROYO.
    • Gracias, esto funciona en todos los dispositivos que he probado
    • Puedo confirmar que funciona también en el Kindle fire HD
    • Pero la mala noticia, lo he probado en el galaxy S3 y se encontró un comportamiento inesperado. Mi aplicación se puso a trabajar en el paisaje. Si quiero salir de la aplicación, a continuación, bloquear el teléfono (apagar pantalla) y, a continuación, de nuevo en el teléfono, la aplicación vuelve como retrato. Yo depurar el código y parece que «getResources().getConfiguration().orientación» devuelve siempre retrato cuando regresaba de un bloqueo de la pantalla en lugar de la aplicación de la orientación del paisaje la configuración especificada en el manifiesto.
    • Sólo probado con Android 6.0 en un Nexus9. Todavía funciona como un encanto.

  2. 18

    He modificado diyism respuestas ligeramente para compensar el hecho de que usted no puede utilizar reverse_landscape y reverse_portrait modos antes de la versión 2.3

    private static void disableRotation(Activity activity)
    {       
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = activity.getWindowManager().getDefaultDisplay().getOrientation();
    
        //Copied from Android docs, since we don't have these values in Froyo 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
    
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)
        {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }
    
        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
        {
            if (orientation == Configuration.ORIENTATION_PORTRAIT)
            {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
            {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        }
        else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) 
        {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) 
            {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
            {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }
    
    private static void enableRotation(Activity activity)
    {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
    • Este código no funciona para todos los dispositivos. Por ejemplo, el Xoom tiene ROTATION_270 asignada a la VERTICAL, no REVERSE_PORTRAIT. La solución a continuación hace el trabajo para.
  3. 6

    para temporalmente en la pantalla de bloqueo usted puede utilizar fácilmente:

    //developing for android tablets **<uses-sdk android:minSdkVersion="12" />**
    //works perfectly... **WATCH OUT**: look portrait to reverse-portrait on api level 13 :)
    
    currentActivity.setRequestedOrientation(currentActivity.getResources().getConfiguration().orientation);
    
    //to re-enable sensor, just do:
    
    currentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

    utilizado para una temperatura de bloqueo de pantalla durante la muestra de diálogo y haciendo importante el trabajo de fondo..

    asegúrese de que currentActivity es válida en el momento de intentar acceder a él, de lo contrario no funciona 🙂

    buena suerte 🙂

    • Funciona perfectamente solo en algunas versiones de android. Cuales se hizo la prueba? Hice la prueba en los teléfonos tanto en el paisaje y a la inversa paisaje orientaciones?
    • hey, parece que si el dispositivo de orientación es vertical, se utiliza en la pantalla de bloqueo, se bloquea a la inversa retrato en la api de nivel 13 (3.2, creo).. así que el código debe ser adaptados de allí, estoy en ello 🙂 sry cambio, yo no lo cambio esta vez…
  4. 3
    //Works on all devices. The other solution only works on 1/2 of the devices.
    //Lock orientation
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    lockOrientation(rotation, Surface.ROTATION_270);
    //Ensure that the rotation hasn't changed
    if (getWindowManager().getDefaultDisplay().getRotation() != rotation) {
    lockOrientation(rotation, Surface.ROTATION_90);
    }
    //...
    private void lockOrientation(int originalRotation, int naturalOppositeRotation) {
    int orientation = getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    //Are we reverse?
    if (originalRotation == Surface.ROTATION_0 || originalRotation == naturalOppositeRotation) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
    setReversePortrait();
    }
    } else {
    //Are we reverse?
    if (originalRotation == Surface.ROTATION_0 || originalRotation == naturalOppositeRotation) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } else {
    setReverseLandscape();
    }
    }
    }
    @SuppressLint("InlinedApi") 
    private void setReversePortrait() {
    if (Build.VERSION.SDK_INT >= 9) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
    } else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    }
    @SuppressLint("InlinedApi") 
    private void setReverseLandscape() {
    if (Build.VERSION.SDK_INT >= 9) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
    } else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    }
    • He visto tu comentario anterior acerca de la Kindle Fire HD. Estoy teniendo un problema similar, ahora en la que he tenido dos soluciones diferentes (básicamente la misma lógica) que funcionan a través de todos mis teléfonos y tabletas, excepto para el Kindle Fire HD. Escribir en un caso especial basado en android.os.Construir los valores se siente más chapucero que me siento cómodo con. Has descubierto por qué la Fire HD es diferente, una solución elegante, y/o la cantidad de Kindle de la línea de dispositivos de actuar de la misma? Encantados de discutir con usted. Thx
    • es porque la naturalOppositeRotation es diferente en algunos teléfonos. Utilizando el código de arriba cifras cuál es el valor predeterminado es para tu teléfono mediante la comprobación de si la rotación ha cambiado. Puedo guardar el valor de naturalOppositeRotation en las preferencias de usuario una vez que la figura fuera la primera vez.
    • te perdiste el punto de la línea de la API… eso es irrelevante para la solución. A la INVERSA.. no existe antes de las 9.
    • Así, el genio en esto es que inmediatamente después de llamar a setRequestedOrientation, getRotation devuelve el nuevo valor…pensé que iba a ser un proceso asincrónico y no estar disponible inmediatamente. Muy perspicaz y loco que es, de modo oculto por el hilo con un solo upvote (de mí).
    • usted lo consiguió. Para ser justo con los otros carteles de esta completa solución se añadió meses después de la pregunta original.
    • He probado este tipo de técnica en un Kindle Fire HD de 7″, y causó la pantalla para voltear al revés, a continuación, inmediatamente de vuelta (de las dos llamadas a setRequestedOrientation). Ver a mi rígida solución en mi propia respuesta. Usted puede fácilmente usar isLandscape270() en esta solución, también, si alguien se topa con el mismo problema.

  5. 2

    Uso: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR) debido a que la Orientación está determinada por un físico sensor de orientación: la pantalla rotará en función de cómo el usuario mueve el dispositivo. Esto permite que cualquiera de los 4 posibles rotaciones, independientemente de lo que el dispositivo se hacen normalmente (por ejemplo, algunos dispositivos no se utilizan normalmente rotación de 180 grados). Y el código debe trabajar en la Xoom también …

  6. 2

    Esta solución sólo se basa en los demás. Es una forma diferente de manejar el problema enl8enmentnow corregido: en algunos dispositivos paisaje es ROTATION_90, pero en (algunos) otros es ROTATION_270. Cuando traté de algo como enl8enmentnow la solución en un Kindle Fire HD de 7″, que hizo que la pantalla gire al revés, y luego inmediatamente a la espalda. No he visto a ninguna otra de las ideas que el disco duro de código que los dispositivos de considerar el paisaje de 270, así que aquí es que la rígida solución:

    public static void unlockOrientation() {
    activity.setRequestedOrientation(
    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
    public static void lockOrientation() {
    if (Build.VERSION.SDK_INT < 18) {
    activity.setRequestedOrientation(getOrientation());
    } else {
    activity.setRequestedOrientation(
    ActivityInfo.SCREEN_ORIENTATION_LOCKED);
    }
    }
    private static int getOrientation() {
    int port = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    int revP = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    int land = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    int revL = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
    if (Build.VERSION.SDK_INT < 9) {
    revL = land;
    revP = port;
    } else if (isLandscape270()) {
    land = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
    revL = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    }
    Display display = activity.getWindowManager().getDefaultDisplay();
    boolean wide = activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
    switch (display.getRotation()) {
    case Surface.ROTATION_0:
    return wide ? land : port;
    case Surface.ROTATION_90:
    return wide ? land : revP;
    case Surface.ROTATION_180:
    return wide ? revL : revP;
    case Surface.ROTATION_270:
    return wide ? revL : port;
    default:
    throw new AssertionError();
    }
    }
    private static boolean isLandscape270() {
    return android.os.Build.MANUFACTURER.equals("Amazon")
    && !(android.os.Build.MODEL.equals("KFOT") || android.os.Build.MODEL.equals("Kindle Fire"));
    }

    isLandscape270() detecta si el dispositivo es una 2ª generación de Kindle o posterior (consulte en este enlace, obteniendo el MODEL de en este enlace). No sé si otros dispositivos también deben ser incluidos; por favor comente si sabe de alguna.

    También, en APIs >= 18 esto simplemente utiliza setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED). Sólo he probado que en los emuladores; por favor comente si tiene problemas en dispositivos reales.

  7. 1

    Puede declarar una Actividad como único paisaje o retrato en su AndroidManifest.xml. Añadir la de screenOrientation atributo para el elemento de actividad:

    http://developer.android.com/guide/topics/manifest/activity-element.html

    • Estoy tratando de bloquear la orientación actual en el código de forma temporal. Esto no va a funcionar porque es permanente. Leer mi código a ver lo que yo estoy tratando de hacer.
    • jeje, acabo de leer la descripción en la parte superior de tu pregunta que en realidad no decir que estaban buscando un programática reversible solución..
  8. -1

    Mi solución:

    int orientation=act.getResources().getConfiguration().orientation;
    int rotation=act.getWindowManager().getDefaultDisplay().getOrientation();
    if (orientation==Configuration.ORIENTATION_PORTRAIT)
    {if (rotation==Surface.ROTATION_0 || rotation==Surface.ROTATION_270) //0 for phone, 270 for tablet
    {act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    else
    {act.setRequestedOrientation(9);//instead of SCREEN_ORIENTATION_REVERSE_PORTRAIT when <= android 2.2
    }
    }
    else
    {if (rotation==Surface.ROTATION_90 || rotation==Surface.ROTATION_0) //90 for phone, 0 for tablet
    {act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    else
    {act.setRequestedOrientation(8);//instead of SCREEN_ORIENTATION_REVERSE_LANDSCAPE when <= android 2.2
    }
    }
    • Esto no va a funcionar como el 8 y el 9 por defecto será -1 en Froyo..
    • Yup. Como se ve en la este hilo así. +1 por ser uno de los pocos que se observó este.

Dejar respuesta

Please enter your comment!
Please enter your name here