如何在Froyo中检测设备的确切方向?

Cha*_*ltz 2 android

我试图暂时锁定Android设备的方向,大多数情况下它会随着传感器的变化而变化.所以我想要做的是弄清楚当前的方向(横向,反向横向,纵向,反向肖像)是什么,将方向更改为该方向,然后将其更改回原来的方向.

我知道我可以使用诸如int orientation = this.getResources().getConfiguration().orientation等代码.this.setRequestedOrientation(取向); 这个问题通常是所讨论的方向被设置为"未定义"或者可能是"用户"或"传感器",这对我没有帮助.如何找出屏幕四个可能的哪一侧"向下"?

我知道getRotation(),如下所述:如何检测android设备的方向?

问题是我可以从设备的"自然"方向找出实际旋转(0度,90度,180度,270度)......但如果我不知道原始方向是什么,这对我没有帮助是.

如何找出设备的转向方式,以便暂时将设备固定到该方向?

UPDATE

不,这不是一个重复的问题.我怀疑在不同的设备上可能会有不同的行为,但不能确定.我做了更多的实验和研究.我原因认为getConfiguration().orientation返回"未指定".我误解了.它确实返回横向或纵向.

但这是问题所在.直到Gingerbread(2.3,API 9)才添加了REVERSE风景和逆向肖像.

因此,如果设备处于反向横向模式,例如,getConfiguration.orientation会告诉我它处于横向模式.然后,当我将所请求的方向设置为landscape-bam时,屏幕会颠倒翻转.

我没有意识到这在Froyo中更难,所以我将重新解释我之前拼写的问题:

在Froyo中,如何检测设备是横向,反向横向,纵向还是反向纵向?

建议列出所有工作 - 姜饼或更高.

cro*_*cha 8

我在另一篇文章中修改了diyism的答案,为Froyo工作.由于Froyo不支持reverse_landscape,它将显示为颠倒但在您解锁后将返回正确的方向.在Gingerbread中,以后它应该没有问题.

不是一个完美的解决方案,但足以满足我的需求.

public static void disableRotation(Activity activity)
{       
    final int orientation = activity.getResources().getConfiguration().orientation;
    final int rotation = activity.getWindowManager().getDefaultDisplay().getOrientation();

    // Copied from Android docs, since we don't have these values in Froyo 2.2
    int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
    int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)
    {
        SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    }

    if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
    {
        if (orientation == Configuration.ORIENTATION_PORTRAIT)
        {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }
    else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) 
    {
        if (orientation == Configuration.ORIENTATION_PORTRAIT) 
        {
            activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
        {
            activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
    }
}

public static void enableRotation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
Run Code Online (Sandbox Code Playgroud)