如何检测启动器是否支持主屏幕旋转

8

这可能被认为是此帖子的重复,但它从未收到过正式答案,因此也许需要更多上下文才能吸引答案。

基本上,我已经设置了一个监视主屏幕旋转的Service,当发生旋转时,我的AppWidgets会响应地进行刷新。

虽然这在所及之处都工作良好,但这种方法的一个巨大缺陷是它实际上只检测到屏幕旋转,而不是具体地检测到主屏幕旋转。

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

我的小部件随后会认为它们需要获取和显示旋转视图的新内容,但如果主屏幕本身不支持主屏幕旋转,则这项工作不仅是浪费的,而且还会导致糟糕的UI。

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

我可以创建一个选项来启用或禁用此旋转功能,其中默认为关闭,但实际上我想默认情况下启用该功能...否则,具有旋转主屏幕的用户将认为我的小部件无法很好地响应旋转,而不会花时间查看启用其设备上功能的选项。

5个回答

1

主屏幕(或启动屏幕)非常具体,没有确切的方法来表达每个屏幕的方向。甚至,你可能有一个倾斜的主屏幕!

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

但是:您可以在第一次运行时轻松地添加某种复选框,询问用户是否支持主屏幕方向变化。这很容易添加,并且对用户不会造成太多麻烦! :)

编辑:如果您想确定正在更改方向的活动是哪一个,则可以使用getRunningAppProcesses获取所有正在运行的应用程序列表,然后检查每个结果项的importance是否为IMPORTANCE_FOREGROUND。这样,您就可以知道用户是否在前台运行应用程序时更改了方向,并且可以检查是应用程序还是主屏幕调用了onConfigurationChanged


1
这个答案可能会让你感到无聊。但事实上,你无法确切地知道是否支持旋转或检测启动器何时旋转。

启动器只是一个普通的Android应用程序。为了满足您的要求,它们应该:

  1. 通过Content Provider公开数据:让您知道它们是否支持旋转,可以做什么等等,并拥有一个众所周知的文档。
  2. 通过BroadcastReceiver发送事件,以便您监听该事件。

通常情况下,它们不会这样做。


我正在通过运行的“服务”中的“onConfigurationChanged(newConfig)”检测旋转,然后查看“newConfig.orientation”是否发生了方向变化。从“newConfig”中有没有办法知道哪个“Activity”或应用程序已经改变了它的方向? - drmrbrewer

0
boolean  autoRotateOn  = (android.provider.Settings.System.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0) == 1) ; 

1
这不仅仅是检测是否支持/激活旋转(一般情况下),而不是特定的主屏幕旋转吗?您可以拥有旋转应用程序,而主屏幕始终固定。 - drmrbrewer
如果我们想要固定应用程序,可以在Activity.onCreate方法中使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);或在AndroidManifest.xml中设置android:configChanges=”orientation”。 - TanLingxiao

0

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

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

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 英寸,通常用于检测启动器是否可以旋转。

我认为这不是一个变通方法,如果我在开发应用程序时,这就是我会采取的方法。

希望能对你有所帮助!


0

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

如何确定前台应用程序是否为启动器?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接