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