【问题标题】:How to detect exact orientation of device in Froyo?如何在 Froyo 中检测设备的准确方向?
【发布时间】:2011-12-05 16:55:29
【问题描述】:

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

我知道我可以使用以下代码 int 方向 = 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 会告诉我它处于横向模式。然后,当我将请求的方向设置为横向时--bam,屏幕会上下翻转。

我没有意识到这在 Froyo 中更难,所以我将重新表述我之前提出的问题:

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

建议列出了所有工作 - 对于 Gingerbread 或更高版本。

【问题讨论】:

标签: android


【解决方案1】:

我在另一篇文章中修改了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);
}

【讨论】:

  • 我只在 Gingerbread 中测试过它,但它在那里完美运行——正是我需要的!
【解决方案2】:

我不确定常量是否是该 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); 
    }

【讨论】:

    【解决方案3】:

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

    Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    Point size = new Point();
    Display.getSize(size);
    
    boolean isLandscape = size.x > size.y;
    

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

    【讨论】:

      【解决方案4】:

      我在 Froyo 遇到了类似的问题

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

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

      主 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);
      }
      

      问题:

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

      那么,解决办法是什么?程序是否应该不断要求获取当前方向?

      【讨论】:

        【解决方案5】:

        我在这个网站上找到了另一个简单的解决方案: 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 以来就存在并且尚未弃用: this.getResources().getConfiguration().orientation

        比较一下:

        • Configuration.ORIENTATION_LANDSCAPE
        • Configuration.ORIENTATION_SQUARE
        • Configuration.ORIENTATION_PORTRAIT

        对我来说它有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 2021-12-29
          • 2014-08-30
          • 2013-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多