【问题标题】:How to detect if launcher supports home screen rotation如何检测启动器是否支持主屏幕旋转
【发布时间】:2016-03-01 11:12:03
【问题描述】:

这可能被认为是this post 的重复,但从未得到正确答案,因此该问题可能需要更多上下文来吸引答案。

基本上,我已经设法设置了一个监控 Service 来监视主屏幕旋转,当这种情况发生时,我的 AppWidgets 会刷新以响应。

虽然这工作正常,但该方法的一个大缺陷是它实际上只检测屏幕旋转,而不是具体检测主屏幕旋转。 p>

因此,通常设备会支持在普通应用中旋转屏幕(即旋转 Activity)。问题是在这种情况下旋转屏幕会错误地触发我的监控Service

然后我的小部件认为他们需要为旋转的视图获取和显示新内容,但如果主屏幕本身不支持主屏幕旋转,那么这项工作不仅浪费了,而且还会导致用户界面不佳。

那么有没有办法检查启动器是否支持主屏幕旋转?或者,一种可以检测主屏幕旋转的方式,而不仅仅是屏幕的旋转(例如在应用中)?

我可以创建一个选项来启用或不启用此旋转功能,默认设置为关闭,但我真的希望默认启用该功能...否则使用旋转主屏幕的用户会考虑我的小部件对旋转反应不佳,没有花时间研究为他们的设备启用该功能的选项。

【问题讨论】:

    标签: android homescreen android-launcher


    【解决方案1】:

    这个答案应该会让你感到厌烦。但实际上,您无法确切知道一个启动器是否支持旋转或检测启动器何时旋转。

    Launcher 只是一个普通的安卓应用程序。为了满足您的要求,他们应该:

    1. 通过Content Provider公开数据:让你知道他们是否支持旋转。他们能做什么等等......并且有一个众所周知的文件。
    2. 当他们轮流通过BroastCastReceiver 时发送一个事件,以便您收听该事件。

    通常,他们没有

    【讨论】:

    • 我正在通过onConfigurationChanged(newConfig) 检测正在运行的Service 的旋转,然后查看newConfig.orientation 以查看方向是否发生了变化。有什么方法可以告诉newConfig Activity 或应用程序的方向发生了变化吗?
    【解决方案2】:

    主页(或启动)屏幕非常具体,没有明确的方法可以表达每个屏幕的方向。天啊,你可以有一个对角线的主屏幕!

    因为有大量的启动屏幕实现,任何给定设备上的行为都是不确定的。

    但是:您可以在第一次运行时轻松添加某种复选框,询问用户他们的主屏幕是否支持方向转换。这将非常容易添加,并且不会给用户带来太多麻烦! :)

    编辑:如果您想确定哪个活动的方向发生了变化,您可以简单地使用getRunningAppProcesses 获取所有正在运行的应用程序的列表,然后检查每个结果项目的importance 是否有@ 987654323@。这样,您将知道用户是否在正在运行的应用程序处于前台时更改了方向,并且可以检查调用onConfigurationChanged的应用程序或主屏幕!

    【讨论】:

      【解决方案3】:
      boolean  autoRotateOn  = (android.provider.Settings.System.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0) == 1) ; 
      

      【讨论】:

      • 这不只是检测是否支持/激活旋转(通常),而不是具体的主屏幕旋转?您可以让应用旋转,而主屏幕始终固定。
      • 如果我们想修复应用,我们可以使用:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);在 Activity.onCreate 方法中,或者设置 AndroidManifest.xml android:configChanges=”orientation”
      【解决方案4】:

      现在虽然没有特定的方法来检测主屏幕的屏幕方向变化,但我会盲目地通过在onConfigurationChanged事件期间检测前台是什么应用来解决这个问题。

      How to determine if the foreground app is the launcher?

      上面帖子中的方法检索前台应用程序的包名,并将其与设备上安装的启动器应用程序的包名进行比较。

      【讨论】:

        【解决方案5】:

        您最好检测一下系统是否是平板电脑。以下是我的发现:

        测试可以旋转启动器的设备:

        Samsung Galaxy Note 2 -- No
        Galaxy S4 -- No
        Galaxy S5 with Nova Launcher -- No
        Galaxy S6 -- No
        HTC One M7 Sense Launcher -- No
        Kyocera Hydro ICS Launcher -- No
        Galaxy Reverb, Galaxy Centura -- No
        Galaxy Note 4 TW -- No
        LG G3 -- No
        LG G2 -- No
        
        Tablets:
        Dell Venue 8 -- Yes, Stock Launcher
        Verizon Ellipsis -- Yes
        HP Slate -- Yes
        Galaxy Tab 3 - Yes
        Lenovo Tab - Yes
        Acer Iconia Tab -- Yes
        

        要检测平板电脑,您可以使用以下代码:

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width=dm.widthPixels;
        int height=dm.heightPixels;
        int dens=dm.densityDpi;
        double wi=(double)width/(double)dens;
        double hi=(double)height/(double)dens;
        double x = Math.pow(wi,2);
        double y = Math.pow(hi,2);
        double screenInches = Math.sqrt(x+y);
        

        double screenInches 可用于一个数字,例如 7 英寸,通常检测发射器是否可以旋转。

        我不认为这是一种解决方法,老实说,如果我正在开发应用程序,我会这样做。

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多