我查看了一下Android源代码,发现以下代码:
public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
String allowedProviders = Settings.Secure.getString(cr, LOCATION_PROVIDERS_ALLOWED);
return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
}
public static final void setLocationProviderEnabled(ContentResolver cr,
String provider, boolean enabled) {
if (enabled) {
provider = "+" + provider;
} else {
provider = "-" + provider;
}
putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider);
}
我相信,如果您拥有root访问权限,则可以读取和写入Settings.Secure。通过这种方式,您应该能够控制GPS(setLocationProviderEnabled)。
然而,据我了解,它不会关闭GPS硬件,只会忽略此位置提供程序。
我不知道有哪些接口可以与GPS通信并关闭硬件。但是,您还有另一个选择,即禁用负责GPS的内核模块(我不知道它的名称)。
更新1
我检查了Android(4.1)中WRITE_SECURE_SETTINGS的定义。在这里。
<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
我找到了这种更改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。
system/app
感到多么舒适?这样可以授予apk所需的任何权限。这就是avast为其反盗版所做的事情。但是有一个问题,那就是卸载。 - A--C