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