Verifique a orientação no telefone Android

Respostas:

676

A configuração atual, conforme usada para determinar quais recursos recuperar, está disponível no Configurationobjeto 'Recursos' :

getResources().getConfiguration().orientation;

Você pode verificar a orientação observando seu valor:

int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
} else {
    // In portrait
}

Mais informações podem ser encontradas no Desenvolvedor Android .

hackbod
fonte
2
Oh, desculpe, eu entendi errado, pensei que você estava dizendo que o serviço não veria a configuração mudar se a configuração mudar. O que você está descrevendo é que ... bem, ele não está vendo nada, porque nada está mudando, porque o iniciador bloqueou a orientação da tela e não permite que ele mude. Portanto, é correto que a orientação não mude, porque a orientação não mudou. A tela ainda está em retrato.
23412 hackbod
A coisa mais próxima que posso fazer é ler a orientação dos sensores, que envolve matemática, que não estou muito interessada em descobrir no momento.
Archimedes Trajano
13
Não há nada para se incomodar. A tela não girou, ainda está em retrato, não há rotação para ver. Se você deseja monitorar como o usuário está movendo o telefone, independentemente de como a tela está sendo girada, sim, você precisa observar diretamente o sensor e decidir como deseja interpretar as informações que obtém sobre o movimento do dispositivo.
21412 hackbod
4
Isso falhará se a orientação da tela for fixa.
AndroidDev
7
Se a atividade bloquear a exibição ( android:screenOrientation="portrait"), esse método retornará o mesmo valor, independentemente de como o usuário gire o dispositivo. Nesse caso, você usaria o acelerômetro ou o sensor de gravidade para descobrir a orientação corretamente.
Cat
169

Se você usar a orientação getResources (). GetConfiguration (). Em alguns dispositivos, errará. Usamos essa abordagem inicialmente em http://apphance.com . Graças ao registro remoto do Apphance, pudemos vê-lo em diferentes dispositivos e vimos que a fragmentação desempenha seu papel aqui. Vi casos estranhos: por exemplo, alternando retrato e quadrado (?!) no HTC Desire HD:

CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square

ou não alterar a orientação:

CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0

Por outro lado, a largura () e a altura () estão sempre corretas (são usadas pelo gerenciador de janelas, por isso deveria ser melhor). Eu diria que a melhor idéia é fazer a largura / altura verificando SEMPRE. Se você pensar um pouco, é exatamente isso que você deseja - saber se a largura é menor que a altura (retrato), o oposto (paisagem) ou se são iguais (quadrado).

Então se resume a este código simples:

public int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}
Jarek Potiuk
fonte
3
Obrigado! Inicializar a "orientação" é supérfluo.
precisa saber é o seguinte
getWidthe getHeightnão são preteridos.
FindOut_Quran
3
@ user3441905, sim, são. Use em getSize(Point outSize)vez disso. Estou usando a API 23.
WindRider 2/15/15
@ jarek-potiuk está obsoleto.
Hades
53

Outra maneira de resolver esse problema é não depender do valor de retorno correto da exibição, mas depender da resolução dos recursos do Android.

Crie o arquivo layouts.xmlnas pastas res/values-lande res/values-portcom o seguinte conteúdo:

res / valores-terra / layouts.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">true</bool>
</resources>

res / valores-porta / layouts.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">false</bool>
</resources>

No seu código-fonte, agora você pode acessar a orientação atual da seguinte maneira:

context.getResources().getBoolean(R.bool.is_landscape)
Paulo
fonte
1
I como este, pois utiliza a orientação que maneira o sistema já está determinando
KrustyGString
1
Melhor resposta para verificação de paisagem / retrato!
precisa saber é
Qual será o seu valor no arquivo de valores padrão?
Shashank Mishra 26/02
46

Uma maneira completa de especificar a orientação atual do telefone:

    public String getRotation(Context context){
    final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
           switch (rotation) {
            case Surface.ROTATION_0:
                return "portrait";
            case Surface.ROTATION_90:
                return "landscape";
            case Surface.ROTATION_180:
                return "reverse portrait";
            default:
                return "reverse landscape";
            }
        }

Chear Binh Nguyen

Nguyen Minh Binh
fonte
6
Há um erro de digitação no seu post - ele deve dizer .getRotation () não getOrientation
Keith
1
+1 para isso. Eu precisava saber a orientação exata, não apenas paisagem versus retrato. getOrientation () está correto, a menos que você esteja no SDK 8+; nesse caso, você deve usar getRotation (). Os modos 'reverso' são suportados no SDK 9+.
Paul
6
@Keith @Paul Não me lembro como getOrientation()funciona, mas isso não está correto se estiver usando getRotation(). Obter "Returns the rotation of the screen from its "natural" orientation." fonte de rotação . Portanto, em um telefone dizendo que ROTATION_0 é retrato provavelmente está correto, mas em um tablet sua orientação "natural" é provavelmente paisagem e ROTATION_0 deve retornar paisagem em vez de retrato.
Jp36 16/01/2013
Parece que este é o método preferido para aderir: developer.android.com/reference/android/view/…
jaysqrd
Esta é uma resposta errada. Por que foi votado? getOrientation (float [] R, float [] values) calcula a orientação do dispositivo com base na matriz de rotação.
user1914692
29

Aqui está a demonstração do snippet de código, como obter orientação da tela, foi recomendado por hackbod e Martijn :

❶ Disparar quando mudar de orientação:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        int nCurrentOrientation = _getScreenOrientation();
    _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}

❷ Obtenha orientação atual, como o hackbod recomenda:

private int _getScreenOrientation(){    
    return getResources().getConfiguration().orientation;
}

AreExistem soluções alternativas para obter a orientação atual da tela ❷ siga a solução Martijn :

private int _getScreenOrientation(){
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        return display.getOrientation();
}

Nota : tentei implementar o ❷ & ❸, mas na orientação do RealDevice (NexusOne SDK 2.3), ele retorna a orientação incorreta.

★ Portanto, recomendo usar a solução ❷ para obter a orientação da tela que possui mais vantagens: claramente, simples e funciona como um encanto.

★ Verifique cuidadosamente o retorno da orientação para garantir a correção conforme o esperado (pode haver limitações, dependendo da especificação dos dispositivos físicos)

Espero que ajude,

NguyenDat
fonte
16
int ot = getResources().getConfiguration().orientation;
switch(ot)
        {

        case  Configuration.ORIENTATION_LANDSCAPE:

            Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
        break;
        case Configuration.ORIENTATION_PORTRAIT:
            Log.d("my orient" ,"ORIENTATION_PORTRAIT");
            break;

        case Configuration.ORIENTATION_SQUARE:
            Log.d("my orient" ,"ORIENTATION_SQUARE");
            break;
        case Configuration.ORIENTATION_UNDEFINED:
            Log.d("my orient" ,"ORIENTATION_UNDEFINED");
            break;
            default:
            Log.d("my orient", "default val");
            break;
        }
anshul
fonte
13

Use getResources().getConfiguration().orientationda maneira certa.

Você só precisa observar diferentes tipos de paisagens, a paisagem que o dispositivo normalmente usa e a outra.

Ainda não entendo como gerenciar isso.

Neteinstein
fonte
12

Algum tempo se passou desde que a maioria dessas respostas foi publicada e alguns agora usam métodos e constantes obsoletos.

Atualizei o código de Jarek para não usar mais esses métodos e constantes:

protected int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    Point size = new Point();

    getOrient.getSize(size);

    int orientation;
    if (size.x < size.y)
    {
        orientation = Configuration.ORIENTATION_PORTRAIT;
    }
    else
    {
        orientation = Configuration.ORIENTATION_LANDSCAPE;
    }
    return orientation;
}

Observe que o modo Configuration.ORIENTATION_SQUAREnão é mais suportado.

Eu achei isso confiável em todos os dispositivos em que testei, em contraste com o método que sugere o uso de getResources().getConfiguration().orientation

Baz
fonte
Observe que getOrient.getSize (size) requer 13 níveis de API
Lester
6

Verifique a orientação da tela em tempo de execução.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();        
    }
}
Kumar
fonte
5

Há mais uma maneira de fazer isso:

public int getOrientation()
{
    if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
    { 
        Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
        t.show();
        return 1;
    }
    else
    {
        Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
        t.show();
        return 2;
    }       
}
maximus
fonte
4

O SDK do Android pode lhe dizer isso:

getResources().getConfiguration().orientation
Solteiro
fonte
4

Testado em 2019 na API 28, independentemente do usuário ter definido a orientação retrato ou não, e com um código mínimo comparado a outra resposta desatualizada , o seguinte fornece a orientação correta:

/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
    DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected

    if(dm.widthPixels == dm.heightPixels)
        return Configuration.ORIENTATION_SQUARE;
    else
        return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
ManuelTS
fonte
2

Eu acho que esse código pode funcionar após a mudança de orientação ter efeito

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

substitua a função Activity.onConfigurationChanged (Configuration newConfig) e use newConfig, orientação se desejar ser notificado sobre a nova orientação antes de chamar setContentView.

Daniel
fonte
2

Eu acho que usar getRotationv () não ajuda porque http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation () Retorna a rotação da tela do seu "natural" orientação.

portanto, a menos que você conheça a orientação "natural", a rotação não faz sentido.

eu encontrei uma maneira mais fácil,

  Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  Point size = new Point();
  display.getSize(size);
  int width = size.x;
  int height = size.y;
  if(width>height)
    // its landscape

por favor me diga se há algum problema com este alguém?

steveh
fonte
2

tal é sobreposição de todos os telefones, como oneplus3

public static boolean isScreenOriatationPortrait(Context context) {
         return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
         }

código correto da seguinte maneira:

public static int getRotation(Context context){
        final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
            return Configuration.ORIENTATION_PORTRAIT;
        }

        if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
            return Configuration.ORIENTATION_LANDSCAPE;
        }

        return -1;
    }
yueyue_projects
fonte
1

Post antigo que eu conheço. Qualquer que seja a orientação ou a troca, etc. Projetei essa função que é usada para definir o dispositivo na orientação correta, sem a necessidade de saber como os recursos de retrato e paisagem são organizados no dispositivo.

   private void initActivityScreenOrientPortrait()
    {
        // Avoid screen rotations (use the manifests android:screenOrientation setting)
        // Set this to nosensor or potrait

        // Set window fullscreen
        this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        DisplayMetrics metrics = new DisplayMetrics();
        this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

         // Test if it is VISUAL in portrait mode by simply checking it's size
        boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); 

        if( !bIsVisualPortrait )
        { 
            // Swap the orientation to match the VISUAL portrait mode
            if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
             { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
            else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
        }
        else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }

    }

Funciona como um encanto!

Codebeat
fonte
1

Use desta maneira,

    int orientation = getResources().getConfiguration().orientation;
    String Orintaion = "";
    switch (orientation)
    {
        case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
        case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
        case Configuration.ORIENTATION_PORTRAIT:  Orintaion = "Portrait"; break;
        default: Orintaion = "Square";break;
    }

na corda você tem o oriantion


fonte
1

existem muitas maneiras de fazer isso, esse trecho de código funciona para mim

 if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
             // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                      // landscape
        }
Mehroz Munir
fonte
1

Eu acho que essa solução é fácil

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}
Issac Nabil
fonte
Geralmente, as respostas são muito mais úteis se incluem uma explicação sobre o que o código pretende fazer e por que isso resolve o problema sem a introdução de outros.
Tom Aranda
sim muito por isso eu era acho que é não precisa explicar exatamente este bloco de orientação verificação de código se igual Configuration.ORIENTATION_PORTRAIT que é aplicativo média no retrato :)
Issac Nabil
1

Simples código de duas linhas

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // do something in landscape
} else {
    //do in potrait
}
Rezaul Karim
fonte
0

Simples e fácil :)

  1. Faça 2 layouts de XML (retrato e paisagem)
  2. No arquivo java, escreva:

    private int intOrientation;

    no onCreatemétodo e antes de setContentViewescrever:

    intOrientation = getResources().getConfiguration().orientation;
    if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
        setContentView(R.layout.activity_main);
    else
        setContentView(R.layout.layout_land);   // I tested it and it works fine.
Kerelos
fonte
0

Também é importante notar que hoje em dia, há menos boas razões para procurar orientação explícita, getResources().getConfiguration().orientationse você estiver fazendo isso por motivos de layout, pois o Suporte para várias janelas introduzido no Android 7 / API 24+ pode mexer com seus layouts bastante nos orientação. É melhor considerar o uso <ConstraintLayout>e layouts alternativos, dependendo da largura ou altura disponíveis , juntamente com outros truques para determinar qual layout está sendo usado, por exemplo, a presença ou não de certos fragmentos anexados à sua atividade.

qix
fonte
0

Você pode usar isso (com base aqui ):

public static boolean isPortrait(Activity activity) {
    final int currentOrientation = getCurrentOrientation(activity);
    return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}

public static int getCurrentOrientation(Activity activity) {
    //code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
    final Display display = activity.getWindowManager().getDefaultDisplay();
    final int rotation = display.getRotation();
    final Point size = new Point();
    display.getSize(size);
    int result;
    if (rotation == Surface.ROTATION_0
            || rotation == Surface.ROTATION_180) {
        // if rotation is 0 or 180 and width is greater than height, we have
        // a tablet
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_0) {
                result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a phone
            if (rotation == Surface.ROTATION_0) {
                result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            }
        }
    } else {
        // if rotation is 90 or 270 and width is greater than height, we
        // have a phone
        if (size.x > size.y) {
            if (rotation == Surface.ROTATION_90) {
                result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            }
        } else {
            // we have a tablet
            if (rotation == Surface.ROTATION_90) {
                result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
            } else {
                result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            }
        }
    }
    return result;
}
desenvolvedor android
fonte