【问题标题】:Toggle gps on root devices on Android在 Android 上的根设备上切换 gps
【发布时间】:2012-07-07 07:42:19
【问题描述】:

从某些 Android 版本开始(我认为是 2.3.x),无论应用程序拥有什么权限,您都无法通过 API 打开/关闭 GPS。过去,可以通过利用电源控制小部件中的错误(请参阅here),但现在已修复。

假设我有 root 访问权限,如何打开和关闭 GPS?


编辑:this 是您获得读取 jelly bean 日志的权限的方式,普通应用程序不再允许这样做。我尝试对 WRITE_SECURE_SETTINGS 权限使用类似的解决方案来切换 gps ,但没有成功。


编辑:到目前为止,我发现只有一个有效的解决方案:将应用程序转换为系统应用程序(可以找到一个有效的解决方案here,甚至适用于 android 4.2.1)。但是,我想到的是从一开始就使用root绕过它,因为root权限可以根据我所知道的做一切。

【问题讨论】:

  • 不。不知道为什么我是唯一一个问它的人。
  • @androiddeveloper 您对制作另一个(非常有限的)apk 并将其安装到system/app 感觉如何?那应该授予apk所需的任何权限。这就是 avast 的防盗功能。但是,一个问题是卸载。
  • @androiddeveloper:关于“作为根权限可以根据我所知道的一切。”。这并不完全正确。 Android 权限与 linux 权限是分开的。它们有一些重叠(例如一些 uid 映射到一些 Android 权限),但通常您可以将它们视为两个单独的权限层。因此,仅仅拥有 Linux 权限对于 android 权限来说并不算多(因为它们是 Linux 不知道的应用程序级实体)。
  • @A--C 我知道这里写的这个解决方案:stackoverflow.com/a/14850224/878126。问题是我想克服这种方法的缺点(比如卸载)。
  • @Victor Ronin 你确定吗?我认为root权限是“所有权限之母”,它可以完全控制一切。据我所知,它甚至可以替换 rom(尽管它通常是通过引导加载程序完成的。

标签: android gps toggle root


【解决方案1】:

我在Android源代码中看了一点,发现如下代码

 public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
            String allowedProviders = Settings.Secure.getString(cr, LOCATION_PROVIDERS_ALLOWED);
            return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
        }

  /**
   * Thread-safe method for enabling or disabling a single location provider.
   * @param cr the content resolver to use
   * @param provider the location provider to enable or disable
   * @param enabled true if the provider should be enabled
   */
        public static final void setLocationProviderEnabled(ContentResolver cr,
                String provider, boolean enabled) {
            // to ensure thread safety, we write the provider name with a '+' or '-'
            // and let the SettingsProvider handle it rather than reading and modifying
            // the list of enabled providers.
            if (enabled) {
                provider = "+" + provider;
            } else {
                provider = "-" + provider;
            }
            putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider);
        }       

我相信,如果您有 root 访问权限,那么您可以读写 Settings.Secure。这样你应该可以控制 GPS (setLocationProviderEnabled)。

但是,据我了解,它不会关闭 GPS 硬件,只会忽略此位置提供程序。

我不知道会与 GPS 通信并关闭硬件的接口。但是,您拥有的另一个选项是禁用负责 GPS 的内核模块(我不知道它的名称)。

更新 1

我检查了 WRITE_SECURE_SETTIONS 在 Android (4.1) 中是如何定义的。在这里

   <permission android:name="android.permission.WRITE_SECURE_SETTINGS"
        android:permissionGroup="android.permission-group.DEVELOPMENT_TOOLS"
        android:protectionLevel="signature|system|development"
        android:label="@string/permlab_writeSecureSettings"
        android:description="@string/permdesc_writeSecureSettings" />

基于“系统”级别。将其添加到应用程序的清单中,将此应用程序复制到系统映像(您需要将其挂载为可写),然后一切顺利。

还有一件事。 uid shell 有这个权限。

 <assign-permission name="android.permission.WRITE_SECURE_SETTINGS" uid="shell" />   

我不记得了,但有一些方法可以临时更改 uid(如果你是 root)。 我在 Android 代码中的某个地方。所以,你可以把uid改成shell,做点什么再改回来。

更新 2

我找到了这个chainguid的方法。

如果你下载AOSP,你可以在很多地方找到它在原生库中的使用方式

./base/cmds/screenshot/screenshot.c

setuid(AID_SHELL);

./native/cmds/dumpstate/dumpstate.c

setuid(AID_SHELL)

还有其他几个地方。

我认为您应该尝试使用它来获得具有 WRITE_SECURE_SETTINGS 权限的 AID_SHELL 组。

更新 3

我不确定细节。我相信应该有一个用于 gps 硬件的本机驱动程序和 unix 设备。但是,它在不同的设备上可能会有不同的名称。

您可以尝试使用rmmod linux 命令删除一些模块。我相信它应该禁用gps。

【讨论】:

  • 问题是,即使在有根设备上,我也无法获得 WRITE_SECURE_SETTINGS 权限。我正在尝试的是:“su -c pm grant android.permission.WRITE_SECURE_SETTINGS”。它可以很好地获得读取日志的权限,但现在它不适用于此权限。一些应用程序声称成功实现了这一目标。想知道它们是如何工作的。
  • @androiddeveloper:我认为将这条信息包含在问题中是有意义的。我会看看 WRITE_SECURE_SETTINGS 发生了什么
  • 更新了问题以链接到获取根设备的日志权限。正如我已经提到的,同样的方法在这种情况下不起作用。不仅如此,我认为新的 4.2 版本不允许切换移动数据(今天发现它是因为 widgetsoid 应用程序无法切换它)。
  • 所以我无法避免告诉(高级)用户将该应用程序安装为系统应用程序?没有什么可以绕过这个限制,即使拥有应该能够做所有事情的root权限?我认为作为一个系统应用程序,您不需要在清单中添加额外的标志来获得此权限。但是,我从未找到将应用程序自动转换为系统应用程序(在同一个应用程序内)的方法。
  • 你认为你能找到如何做的线索吗?
【解决方案2】:

不需要系统应用程序只需使用 su 在高精度模式下启用 gps 只需使用

 Process proc=Runtime.getRuntime().exec(new String[]{"su",
"pm grant com.your_app_packagename android.permission.WRITE_SECURE_SETTINGS",
"settings put secure location_providers_allowed gps,network,wifi"});
 proc.waitFor();

在后台线程上运行这些命令:)

另外你可以参考这个链接here

【讨论】:

  • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
  • 这些是需要在后台线程中运行的命令。第一个命令调用 su,第二个用于授予安全权限,第三个用于高精度打开 gps
【解决方案3】:

这个SO Question 似乎是最接近与该主题相关的任何内容。

在 2.2 版之前存在一个漏洞利用,可以更改 GPS 设置。在 2.3 之后,目前似乎没有用户干预是不可能的。

以下是几次不成功尝试的答案/cmets: - How can I enable or disable the GPS programmatically on Android? - https://stackoverflow.com/a/10004614/238722

显然有一种使用 BusyBox 的方法,但我在网上找不到任何可靠的东西。来源:https://stackoverflow.com/a/14850224/238722

更新

与 BusyBox 相关的 answer 链接包含此可用的 sample project 可供下载。

【讨论】:

  • 即使在root设备上,你也不能像其他权限一样获取权限吗?您必须将应用程序作为系统应用程序?
  • 这是我从帖子和快速在线研究中收集到的,是的。显然,Android 操作系统只允许系统应用进行这种更改。
  • 您能否尝试为此找到busyBox解决方案?
  • @androiddeveloper 与 BusyBox 相关的答案有一个可用的 sample project 可供下载。我没有 Android 设备,因此无法对其进行测试;不过,海报确认它可以在 4.1.2 上运行。
  • 一些 ROM 实际上允许使用安全性,而不是仅来自系统应用程序。此外,无需要求最终用户将模块安装到 /system/app 中,您可以在后台执行此操作。但是您仍然需要root访问权限,并且必须在之后重新启动手机。要获得一种通用解决方案,您确实需要 a) root、b) 系统 APK 和 c) 重启。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
相关资源
最近更新 更多