Androidスマートフォンの向きを確認する


回答:


676

取得するリソースを決定するために使用される現在の構成は、ResourcesのConfigurationオブジェクトから利用できます。

getResources().getConfiguration().orientation;

値を見て、方向を確認できます。

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

詳細については、Androidデベロッパーをご覧ください。


2
誤解して申し訳ありませんが、構成が変更されてもサービスは構成の変更を認識しないと言っていたと思いました。ランチャーが画面の向きをロックし、変更を許可していないため、何も変化していないため、何も表示されていません。したがって、向きが変更されていないため、.orientationが変更されないのは正しいことです。画面はまだ縦向きです。
ハックボット

私ができる最も近いことは、センサーから方向を読み取ることです。これには、現時点で実際に把握することにあまり熱心ではない数学が含まれます。
アルキメデストラハノ

13
煩わしいことは何もありません。画面は回転しておらず、ポートレートのままで、見る回転はありません。画面がどのように回転しているかに関係なく、ユーザーが携帯電話をどのように動かしているかを監視したい場合は、はい、センサーを直接監視して、デバイスの動きに関する情報をどのように解釈するかを決定する必要があります。
12

4
画面の向きが固定されている場合、これは失敗します。
AndroidDev 2013

7
アクティビティが表示をロックする場合(android:screenOrientation="portrait")、このメソッドは、ユーザーがデバイスを回転させた方法に関係なく、同じ値を返します。その場合は、加速度計または重力センサーを使用して、方向を正しく把握します。

169

一部のデバイスでgetResources()。getConfiguration()。orientationを使用すると、エラーが発生します。最初はhttp://apphance.comでこのアプローチを使用していました。Apphanceのリモートロギングのおかげで、さまざまなデバイスでそれを見ることができ、断片化がここで役割を果たすことがわかりました。私は奇妙なケースを見ました:たとえば、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

または向きをまったく変更しない:

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

一方、width()とheight()は常に正しいです(ウィンドウマネージャーによって使用されるため、より適切なはずです)。最高のアイデアは、常に幅/高さのチェックを行うことだと思います。瞬間について考える場合、これはまさにあなたが望んでいることです-幅が高さ(縦)よりも小さいか、その逆(横)であるか、またはそれらが同じ(正方形)であるかを知ることです。

次に、この単純なコードに行き着きます。

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

3
ありがとう!「オリエンテーション」の初期化は不必要です。
MrMaffen 2014年

getWidthgetHeight非推奨ではありません。
FindOut_Quran

3
@ user3441905、そうです。getSize(Point outSize)代わりに使用してください。私はAPI 23.使用しています
ウィンドライダー

@ jarek-potiukは非推奨です。
Hades

53

この問題を解決する別の方法は、ディスプレイからの正しい戻り値に依存するのではなく、Androidリソースの解決に依存することです。

ファイルを作成しlayouts.xmlたフォルダにres/values-landし、res/values-port次の内容で:

res / values-land / layouts.xml:

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

res / values-port / layouts.xml:

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

ソースコードでは、次のように現在の向きにアクセスできます。

context.getResources().getBoolean(R.bool.is_landscape)

1
システムがすでに方向を決定している方法を使用するので、私はこれが好きです
KrustyGString

1
横向き/縦向きチェックのベストアンサー!
vtlinh

デフォルト値ファイルでその値はどうなりますか?
Shashank Mishra

46

電話の現在の向きを指定する完全な方法:

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

チアビングエン


6
投稿にタイプミスがあります-getOrientationではなく.getRotation()と表示されているはずです
Keith

1
+1。横向きと縦向きだけでなく、正確な向きを知る必要がありました。SDK 8以降を使用している場合を除き、getOrientation()は正しいです。この場合、getRotation()を使用する必要があります。「リバース」モードはSDK 9以降でサポートされています。
ポール、

6
@キース@ポール私はどのようにgetOrientation()動作するか覚えていませんが、を使用してgetRotation()いる場合、これは正しくありません。回転"Returns the rotation of the screen from its "natural" orientation." ソースを取得します。そのため、スマートフォンではROTATION_0が縦長である可能性が高いですが、タブレットでは「自然な」方向が横長である可能性が高く、ROTATION_0は縦長ではなく横長を返すはずです。
jp36 2013年

:次のようになりますが、好ましい方法は、前方に参加しているdeveloper.android.com/reference/android/view/...
jaysqrd

これは間違った答えです。なぜ投票されたのですか?getOrientation(float [] R、float [] values)は、回転行列に基づいてデバイスの向きを計算します。
user1914692 2013

29

以下は、画面の向きを取得する方法のコードスニペットデモです。hackbodMartijnが推奨しています

Orient方向変更時にトリガー:

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

ハックボッドが推奨する現在の方向性を取得します。

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

❸Thereは続く❷現在の画面の向きを取得するための代替ソリューションですマルタインのソリューションを:

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

:❷とbothの両方を実装しようとしましたが、RealDevice(NexusOne SDK 2.3)の向きでは、間違った向きが返されます。

使用済みのソリューションをお勧めしますはより明確な、シンプルで魅力のように機能する、より有利な画面の向きを得るため ❷をます。

★オリエンテーションの戻りを注意深くチェックして、期待どおりに正しいことを確認します(物理デバイスの仕様によっては制限される場合があります)

お役に立てれば幸いです。


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

13

getResources().getConfiguration().orientation正しい方法で使用してください。

さまざまな種類の風景、デバイスが通常使用する風景、その他に注意する必要があります。

それを管理する方法をまだ理解していません。


12

これらの回答のほとんどが投稿されてからしばらく時間が経過し、一部は現在非推奨のメソッドと定数を使用しています。

これらのメソッドと定数をもう使用しないようにJarekのコードを更新しました。

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

このモードConfiguration.ORIENTATION_SQUAREはサポートされなくなったことに注意してください。

私はこれをテストしたすべてのデバイスで信頼できることがわかりました。 getResources().getConfiguration().orientation


getOrient.getSize(size)には13 APIレベルが必要であることに注意してください
Lester

6

実行時に画面の向きを確認します。

@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();        
    }
}

5

それを行うもう1つの方法があります。

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


4

ユーザーが縦向きを設定したかどうかに関係なく、API 28で2019年にテストされました。また、別の古い回答と比較して最小限のコードで、以下は正しい向きを提供します。

/** @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;
}

2

このコードは、向きの変更が有効になった後に機能すると思います

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

setContentViewを呼び出す前に新しい向きについて通知を受けたい場合は、Activity.onConfigurationChanged(Configuration newConfig)関数をオーバーライドし、newConfig、orientationを使用します。


2

http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation()画面の回転を「自然」から返すため、getRotationv()を使用しても役に立たないと思い ますオリエンテーション。

したがって、「自然な」方向を知らない限り、回転は意味がありません。

私はもっ​​と簡単な方法を見つけました、

  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

この人に問題があるかどうか教えてください。


2

これはoneplus3などのすべての電話をオーバーレイします

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

次のように正しいコード:

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

1

私の知っている古い記事。向きはどのようなものでも、入れ替えてもかまいません。この機能は、ポートレートとランドスケープの機能がデバイス上でどのように構成されているかを知る必要なく、デバイスを正しい方向に設定するために使用します。

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

    }

魅力的な作品!


1

この方法を使用して、

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

文字列にはOriantionがあります


1

これを行うには多くの方法がありますが、このコードは私にとってはうまくいきます

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

1

この解決策は簡単だと思います

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}

一般的に、回答にコードの目的、および他の人を紹介することなく問題を解決する理由の説明が含まれている場合、回答ははるかに役立ちます。
Tom Aranda、2017

はい、申し訳ありません。ポートレートでアプリを意味するConfiguration.ORIENTATION_PORTRAITが等しい場合、このコードチェックの向きを正確に説明する必要はないと思いました:)
Issac Nabil

1

単純な2行のコード

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

0

シンプルで簡単:)

  1. 2つのxmlレイアウトを作成します(つまり、縦と横)
  2. Javaファイルで、次のように記述します。

    private int intOrientation;

    onCreate方法と前にsetContentView書き込み:

    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.

0

Android 7 / API 24+で導入さgetResources().getConfiguration().orientationれたマルチウィンドウのサポートがレイアウトをかなり乱す可能性があるため、今日では、レイアウトの理由でそうしている場合、明示的な方向を確認する良い理由はあまりないことも注目に値します。オリエンテーション。より良い使用を考慮する<ConstraintLayout>と、代替レイアウト可能な幅や高さに依存して、あなたの活動に添付されている特定のフラグメントの例えば、使用されているレイアウトの存在を決定するための他のトリックと一緒に、またはありません。


0

これを使用できます(ここに基づいて):

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.