3

从自定义相机活动中拍摄照片时,我正在尝试获取设备方向。以前,我到处检查如何实现它,但人们提出的解决方案没有得到任何结果。

我正在使用这行代码来检索没有结果的方向。它总是返回 1。如果有帮助,我正在使用三星 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;

在您的程序开始时。当预编译器看到这些常量之一时,它会自动将其替换为等效的整数。当您初始化时,您是 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
    }

等等

我个人会选择第二种选择。不必为每次检查调用 getRotation 可能意味着运行时的小幅改进,但尽可能减少处理器使用是一个好习惯。

于 2016-01-25T12:21:57.667 回答