1

我正在创建一个应用程序,它将改变一些其他已安装应用程序的方向,通过 ApplicationInfo 对象读取其他已安装应用程序的方向很简单,但无法更改它。

经过一些研发后,我注意到类似类型的应用程序(改变方向)也运行服务,这意味着它们会即时改变方向,但我不知道他们是如何做到的。

例如像 Smart Rotator 应用程序一样https://play.google.com/store/apps/details?id=net.xdevelop.rotator_t&hl=en

4

2 回答 2

2

您引用的其他应用程序执行的操作与您的预期不同。它们根据设备的加速度计启用屏幕旋转;也就是说,用户旋转设备并且方向改变。它们没有为任何应用程序设置特定的方向。请注意,如果您在横向模式下禁用自动旋转,则方向通常会恢复为纵向。

我以前做过与这些其他应用程序相同的操作。不幸的是,这是我无法分享的专有商业代码。

该方法有两个组成部分:

  1. 检测前台应用程序何时是目标应用程序
  2. 更改显示方向的系统范围首选项

显然你也必须做相反的事情,即事后改回来。

SO的其他地方有一些第1部分的例子。就我而言,我编写了一个服务,该服务不断轮询以查看前台应用程序是什么(因为没有相关的系统事件来通知应用程序更改)。这不是一项微不足道的工作,但可以做到。

第 2 件的相关设置是Settings.System.ACCELEROMETER_ROTATION。我认为您可以使用所有版本的普通应用程序权限来编写它。代码片段如下:

        Settings.System.putInt(
             app.getContentResolver(),
             Settings.System.ACCELEROMETER_ROTATION,
             orientationEnabled ? 1 : 0
        );

另请注意,可以编写一个忽略系统屏幕旋转的应用程序;即将保持锁定在它设计的任何方向。不过这并不常见。

于 2013-01-31T21:53:51.400 回答
1

您可以通过进程间通信来做到这一点。你有几个选择:

1-您可以使用SharedPreferences。从您的应用程序中设置一个 WORLD_READABLE 首选项,以便在您的目标应用程序每次启动时读取。看看这个

2-您可以将此首选项写入 sdcard 上的文件并以相同方式读取。

3-如果您的目标应用程序正在运行(也就是说,它有一个服务或其他东西,因此它的进程是活动的)您可以广播一个意图并从您的目标应用程序接收它。在这里您可以找到有关此主题的帖子。

4- ...简而言之,您需要将参数传递给您的目标应用程序并将您的方向设置为setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

于 2013-01-29T10:05:54.417 回答