AndroidでGPSをプログラム的にオン/オフにする方法に関する質問は知っていますもっている された 議論した 多くの 回答えは常に同じです。
「セキュリティ/プライバシー上の理由から、それはできません。位置情報の設定画面に転送して、ユーザーがそれを有効/無効にできるようにする必要があります。」
それは理解していますが、最近購入したタスカー市場から入手でき、これを使って実現できる他の多くのことの中でも、事前に決められたアプリケーションに入るときにGPSを自動的に有効にし、終了時に無効にするルールを設定できます(ここやり方のチュートリアルについては、こちらをご覧ください。問題なく動作します!) また、このアプリは、多くの Android バージョンやさまざまなデバイスで動作し、ルート化する必要すらないため、ファームウェア署名キーで署名することはできません。
これを自分のアプリで実行したいと思います。もちろん、ユーザーのプライバシーを侵害したくないので、まずはユーザーに、通常の「決定を記憶する」チェックボックスで自動的にオンにするかどうかを尋ね、ユーザーが「はい」と答えたら有効にします。
Tasker がこれをどうやって実現しているかについて、何かアイデアや手がかりを持っている人はいますか?
ベストアンサー1
GPSは搾取する電源管理ウィジェットのバグ。こちらを参照xda スレッド議論のため。
私が使用しているサンプルコードは次のとおりです
private void turnGPSOn(){
String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if(!provider.contains("gps")){ //if gps is disabled
final Intent poke = new Intent();
poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
poke.setData(Uri.parse("3"));
sendBroadcast(poke);
}
}
private void turnGPSOff(){
String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if(provider.contains("gps")){ //if gps is enabled
final Intent poke = new Intent();
poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
poke.setData(Uri.parse("3"));
sendBroadcast(poke);
}
}
既存のバージョンの電源制御ウィジェットで GPS を切り替えることができるかどうかをテストするには、以下を使用します。
private boolean canToggleGPS() {
PackageManager pacman = getPackageManager();
PackageInfo pacInfo = null;
try {
pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);
} catch (NameNotFoundException e) {
return false; //package not found
}
if(pacInfo != null){
for(ActivityInfo actInfo : pacInfo.receivers){
//test if recevier is exported. if so, we can toggle GPS.
if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){
return true;
}
}
}
return false; //default
}