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

时间:2011-12-05 16:55:30

标签: android

我正在尝试暂时锁定Android设备的方向,其中大部分时间都是通过传感器更改的。所以我想要做的是弄清楚当前的方向(横向,反向横向,纵向,反向肖像)是什么,将方向更改为该方向,然后将其更改回原来的方向。

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

我知道getRotation(),如下所述:how to detect orientation of android device?

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

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

更新

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

但这是问题所在。直到Gingerbread(2.3,API 9)才添加了REVERSE横向和反向肖像。

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

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

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

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

5 个答案:

答案 0 :(得分:8)

我在另一篇文章中修改了diyism's answer以便为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);
}

答案 1 :(得分:1)

我不确定常量是否是该API未实现的问题。 你尝试过这样的事吗?

 switch (((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation()) {
    case Surface.ROTATION_90: 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
        break;
    case Surface.ROTATION_180: 
        setRequestedOrientation(9); /* ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT */
        break;          
    case Surface.ROTATION_270: 
        setRequestedOrientation(8); /* ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE */
        break;
    default : 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    }

答案 2 :(得分:0)

我不确定你的问题是什么。您是否尝试确定设备当前是面向横向还是纵向模式?如果是这样,您可以快速获取该信息:

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
Display.getSize(size);

boolean isLandscape = size.x > size.y;

如果您将其与Display.getOrientation()结合使用,则应该可以访问所需的所有信息。

答案 3 :(得分:0)

我在Froyo遇到类似的问题

在清单文件的活动部分中,我声明:

<activity ...
    android:configChanges="keyboardHidden|orientation">
</activity>

主要活动包含在恢复应用程序或收到配置更改事件时获取有关轮换的信息的代码:

public void onResume() {
    super.onResume();
    showRotation();
    ...
}

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    showRotation();
    ...
}

public void showRotation() {
    // int rotationType = getWindowManager().getDefaultDisplay().getOrientation(); // Deprecated
    int rotationType = getWindowManager().getDefaultDisplay().getRotation(); // API 8+ (Android 2.2.x or higher)
    Log.d(MYTAG, "rotation type: " + rotationType);
}

问题:

  • 如果设备从横向旋转到纵向然后反转横向,则一切都按预期工作。
  • 如果设备从横向旋转到反向横向,则根本不会触发配置更改事件。该程序仍然认为该设备处于横向模式。

那么,解决方案是什么?程序是否应该不断要求获得当前的方向?

答案 4 :(得分:0)

我在这个网站上找到了另一个简单的解决方案: http://sagistech.blogspot.ch/2010/12/finding-android-screen-orientation.html

  

获取Android屏幕方向(横向/纵向)的方法有多种,但有些方法存在问题:   this.getWindowManager()。getDefaultDisplay()。getOrientation()    已弃用

     

this.getWindowManager()。getDefaultDisplay()。getRotation()    仅适用于Android 2.2

     

我发现这是迄今为止最好的资源,因为它自API 1&amp;它还没有被弃用,但是:   this.getResources()。getConfiguration()。取向

     

将其与:

进行比较      
      
  • Configuration.ORIENTATION_LANDSCAPE
  •   
  • Configuration.ORIENTATION_SQUARE
  •   
  • Configuration.ORIENTATION_PORTRAIT
  •   

对我而言,它有效。