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



这可能被认为是这篇文章的重复,但它从未得到正确的答案,所以也许这个问题需要更多的上下文来吸引答案。

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

虽然这在某种程度上工作正常,但该方法的一大缺陷是它实际上只检测屏幕旋转,而不是专门检测主屏幕旋转

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

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

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

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

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

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

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

通常,他们不会

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

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

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

编辑:如果要确定哪个活动的方向发生了变化,只需获取所有正在运行的应用程序的列表getRunningAppProcesses,然后检查每个结果项的importance是否有IMPORTANCE_FOREGROUND。这样,您将知道用户是否在正在运行的应用程序具有前台时更改了方向,并可以检查是应用程序还是主屏幕调用了onConfigurationChanged

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

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

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

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

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

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

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英寸,以通常检测发射器是否可以旋转。

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

希望对您有所帮助!

最新更新