web-dev-qa-db-ja.com

Androidデバイスの現在の向き(ActivityInfo.SCREEN_ORIENTATION_ *)を取得するにはどうすればよいですか?

デバイスの詳細な向き、できればSCREEN_ORIENTATION_LANDSCAPESCREEN_ORIENTATION_PORTRAITSCREEN_ORIENTATION_REVERSE_LANDSCAPESCREEN_ORIENTATION_REVERSE_PORTRAIT from ActivityInfoまたは同等のもの。

StackOverflowに関するここの答えのいくつかは含まれています

getWindowManager().getDefaultDisplay().getRotation()

しかし、これは実際にデバイスがポートレートモードかランドスケープモードかを判断するのではなく、本来の位置を基準にしてデバイスがどのように回転するかを示します。

getResources().getConfiguration().orientation

次の3つのいずれかを返します:ORIENTATION_LANDSCAPEORIENTATION_PORTRAITORIENTATION_SQUARE、それは実際には、電話がどの方向に向けられているか(それが逆さまになっているか、どちらの側に向けられているかにかかわらず)私に教えてくれません。

後者をDisplayMetricsと組み合わせて使用​​して、デバイスの自然な向きを調べることができますが、本当に良い方法はありませんか?

56
Zoltán

私は次のソリューションを使用することになりました:

private int getScreenOrientation() {
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int width = dm.widthPixels;
    int height = dm.heightPixels;
    int orientation;
    // if the device's natural orientation is portrait:
    if ((rotation == Surface.ROTATION_0
            || rotation == Surface.ROTATION_180) && height > width ||
        (rotation == Surface.ROTATION_90
            || rotation == Surface.ROTATION_270) && width > height) {
        switch(rotation) {
            case Surface.ROTATION_0:
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_180:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            case Surface.ROTATION_270:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
            default:
                Log.e(TAG, "Unknown screen orientation. Defaulting to " +
                        "portrait.");
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;              
        }
    }
    // if the device's natural orientation is landscape or if the device
    // is square:
    else {
        switch(rotation) {
            case Surface.ROTATION_0:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_180:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
            case Surface.ROTATION_270:
                orientation =
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            default:
                Log.e(TAG, "Unknown screen orientation. Defaulting to " +
                        "landscape.");
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;              
        }
    }

    return orientation;
}

[〜#〜] note [〜#〜]:一部のユーザー(以下のコメントのGeltrudeとholtaf)は、自然な方向からの回転方向としてこのソリューションがすべてのデバイスで機能しないことを指摘しました。標準化されていません。

89
Zoltán

簡単なアプローチは、使用することです

getResources().getConfiguration().orientation

1は縦向き、2は横向きです。

21
Nilesh
public static int getScreenOrientation(Activity activity) {
        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        int orientation = activity.getResources().getConfiguration().orientation;
        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
          if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) {
            return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
          } else {
            return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
          }
        }
        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
          if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
          } else {
            return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
          }
        }
        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
      }
15

問題は、ランドスケープとポートレートを検出できるが、古いバージョンではサポートされていないため、ランドスケープとリバースプロトレートを逆にできないことだと思います。何ができるかを検出することは、オリエンテーションと回転の両方を使用できることです。私はあなたに役立つかもしれないという考えをあなたに与えています。

これを試してみて、問題を解決できると思います。

            int orientation = getResources().getConfiguration().orientation;
            int rotation = getWindowManager().getDefaultDisplay().getRotation();
            int actual_orientation = -1;
            if (orientation == Configuration.ORIENTATION_LANDSCAPE
            &&  (rotation == Surface.ROTATION_0 
            ||  rotation == Surface.ROTATION_90)){
                orientation = Configuration.ORIENTATION_LANDSCAPE;
            } else if (orientation == Configuration.ORIENTATION_PORTRAIT
                  &&  (rotation == Surface.ROTATION_0 
                   ||  rotation == Surface.ROTATION_90)) {
                orientation = Configuration.ORIENTATION_PORTRAIT;
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE
                  &&  (rotation == Surface.ROTATION_180 
                   ||  rotation == Surface.ROTATION_270)){
                orientation = //any constant for reverse landscape orientation;
            } else {
                if (orientation == Configuration.ORIENTATION_PORTRAIT
                        &&  (rotation == Surface.ROTATION_180 
                         ||  rotation == Surface.ROTATION_270)){
                      orientation = //any constant for reverse portrait orientation;
                }
            }
7
Bharat Sharma

getResources().getConfiguration().orientationは、使用されている現在の向きを知る標準的な方法です。ただし、ニーズを満たしていない場合は、センサーを使用して角度で計算することができます。 thisthis を読む

7
waqaslam

結局、上記のZoltánの回答を使用しましたが、タブレット(Samsung P6210 Galaxy Tab 7.0 Plus)で試してみた場合を除き、これは非常に効果的です。ポートレートモードでは、SCREEN_ORIENTATION_REVERSE_PORTRAITが返されました。したがって、elseステートメント(自然な向きが横向きの場合)でROTATION_90とROTATION_270のケースを交換しましたが、すべて正常に機能しているようです。 (これをゾルタンの回答へのコメントとして投稿するほどの評判はありません。)

2
pfalstad

あなたは非常に簡単な方法でそれをすることができます:画面widhtheightを取得します。デバイスが横向きの場合、画面の幅は常に大きくなります。

Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth(); 
    int height = display.getHeight();
    Toast.makeText(getApplicationContext(), "" + width + "," + height,
            Toast.LENGTH_SHORT).show();
    if (width > height) {
        Toast.makeText(getApplicationContext(), "LandScape",
                Toast.LENGTH_SHORT).show();
    }
1
Aby Mathew