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
Android (4.1) で WRITE_SECURE_SETTIONS がどのように定義されているかを確認しました。ここにあります
<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 シェルにはこの許可があります。
<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を無効にするべきだと思います。