Androidでプログラム的にGPSを有効または無効にするにはどうすればいいですか? 質問する

Androidでプログラム的にGPSを有効または無効にするにはどうすればいいですか? 質問する

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
}

おすすめ記事