3

カスタム カメラ アクティビティから写真を撮るときに、デバイスの向きを取得しようとしています。以前は、それを達成する方法をどこでもチェックしましたが、人々が提案する解決策には結果がありませんでした。

このコード行を使用して方向を取得していますが、結果はありません。常に 1 を返します。役立つ場合は、開発に Samsung Galaxy S III を使用しています。

 int rotation = getWindowManager().getDefaultDisplay().getRotation();
    Log.d(TAG, "Taken rotation " + rotation);
    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 = 0;
                break;
            case Surface.ROTATION_90:
                orientation = 90;
                break;
            case Surface.ROTATION_180:
                orientation =180;
                break;
            case Surface.ROTATION_270:
                orientation = 270;
                break;
            default:
                Log.e(TAG, "Unknown screen orientation. Defaulting to " +
                        "portrait.");
                orientation = 0;
                break;              
        }
4

1 に答える 1

-2

これは私が知っていることに基づく推測ですが、Surface.ROTATION_90 は定数の整数名だと思います。次のように考えてください。

final int Surface.ROTATION_0 = 0;
final int Surface.ROTATION_90 = 1;
final int Surface.ROTATION_180 = 2;
final int Surface.ROTATION_270 = 3;

プログラムの最初に。プリコンパイラは、これらの定数の 1 つを検出すると、それを同等の整数に自動的に置き換えます。int ローテーションを初期化し、これらのいずれかに設定すると、int は定数が初期化された値を保持します。そのため、Surface.Rotation を直接確認したい場合は、おそらく確認するたびに getRotation() を呼び出す必要があります。

何かのようなもの:

Display display = getWindowManager().getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0)
    {
        //whatever you need to do here
    }

または、これらの定数が評価する整数を簡単に確認できます。

int rotation = getWindowManager().getDefaultDisplay().getRotation;
if(rotation == 0)
    {
        //whatever you need to do here
    }

個人的には、2番目のオプションを使用します。すべてのチェックで getRotation を呼び出す必要がないことは、ランタイムのわずかな改善を意味する可能性がありますが、可能な限りプロセッサの使用を最小限に抑えるのは良い習慣です。

于 2016-01-25T12:21:57.667 に答える