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

时间:2016-03-01 11:12:03

标签: android homescreen android-launcher

这可能被认为是this post的重复,但是从来没有得到正确的答案,所以这个问题可能需要更多的背景来吸引答案。

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

虽然这种方法可以正常工作,但该方法的一大缺陷是它实际上只检测屏幕旋转而不是特别主屏幕旋转。

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

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

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

我可以创建一个选项来启用此旋转功能,默认为关闭,但实际上我希望默认情况下启用该功能...否则旋转主屏幕的用户将考虑我的小部件对轮换响应不好,没有花时间查看为其设备启用该功能的选项。

5 个答案:

答案 0 :(得分:1)

家庭(或发布)屏幕非常具体,并且没有明确的方法可以表达每一个屏幕的方向。天啊,你可以有一个对角的主屏幕!

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

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

修改:如果您想确定哪个活动的方向已更改,您只需使用getRunningAppProcesses获取所有正在运行的应用程序的列表,然后检查每个结果项目' importance的{​​{1}}。这样,您就可以知道用户是否在正在运行的应用程序具有前景时更改了方向,并且可以检查它是应用程序还是已调用IMPORTANCE_FOREGROUND的主屏幕! / p>

答案 1 :(得分:1)

这个答案应该让你觉得无聊。但实际上,你不能确切地知道一个启动器是否支持旋转,或者检测启动器何时旋转。

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

  1. 通过Content Provider的公开数据:您知道它们是否支持旋转。他们可以做些什么......并且有一份着名的文件。
  2. 在轮播BroastCastReceiver时发送一个事件,让您听取该事件。
  3. 通常,他们不

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

How to determine if the foreground app is the launcher?

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

答案 4 :(得分: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英寸,以检测发射器是否可以旋转。

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

希望它有所帮助!