5

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

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


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


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

4

3 回答 3

3

我在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

我找到了chaing uid的这种方法。

如果您下载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。

于 2013-02-23T23:14:48.930 回答
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();

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

此外,您可以在此处参考此链接

于 2016-02-10T16:05:21.347 回答
1

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

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

以下是几次不成功尝试的答案/评论: -如何在 Android 上以编程方式启用或禁用 GPS? - https://stackoverflow.com/a/10004614/238722

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

更新

与 BusyBox 相关的答案包含此工作示例项目可供下载。

于 2013-02-23T22:54:59.003 回答