Ответ 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
Я нашел этот метод chaing uid.
Если вы загрузите AOSP, вы можете найти, как он используется в родной библиотеке в кубе мест
./база/CMDS/кадр/screenshot.c
Он устанавливает setuid (AID_SHELL);
./нативный/CMDS/dumpstate/dumpstate.c
УИП (AID_SHELL)
и это в нескольких других местах.
Я думаю, вам следует поэкспериментировать с ним, чтобы получить группу AID_SHELL, у которой есть разрешение WRITE_SECURE_SETTINGS.
Обновление 3
Я не уверен в деталях. Я считаю, что там должен быть собственный драйвер и unix-устройство для аппаратного обеспечения gps. Однако на разных устройствах это можно назвать по-разному.
Вы можете попытаться использовать rmmod команду linux для удаления некоторого модуля. Я считаю, что он должен отключить gps.