24

ユーザーが WiFi や GPS を変更したり、アプリケーションから設定を読み込んだりできないようにしたいと考えています。ユーザーは、アプリケーションの実行中に WiFi と GPS をオン/オフする必要はありません (通知バーから)。BroadcastReceiverGPS のオン/オフをリッスンするものはありますか?

4

11 に答える 11

36

さて、私は多くの掘り下げを行い addGpsStatusListener(gpsStatusListener)、API 24 で廃止されたことを発見しました。そして、私にとって、これは機能しませんでした! したがって、これに対する別の代替ソリューションを次に示します。

アプリで GPS の状態の変化を聞きたい場合(つまり、ユーザーによるオン/オフ)ブロードキャストを使用することは確かに最良のアプローチです。

実装:

/**
 * Following broadcast receiver is to listen the Location button toggle state in Android.
 */
private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            // Make an action or refresh an already managed state.
        }
    }
};

これを Fragment/Activity Lifecycle でも効率的に登録および登録解除することを忘れないでください。

registerReceiver(mGpsSwitchStateReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

たとえば、これを で使用している場合はFragment、 で登録し、onResumeで登録を解除しonDestroyます。また、ロケーション スイッチを有効にする設定にユーザーを誘導している場合、アクティビティが に移動し、フラグメントが停止onStopされるため、での登録解除は機能しません。onPause

このソリューションには多くの答えがあるかもしれませんが、これは管理と使用が簡単です。解決策があれば提案します。

于 2016-09-26T12:23:32.370 に答える
27

GpsStatus.Listener で GPS ステータスをリッスンし、LocationManager に登録できます。

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.addGpsStatusListener(new android.location.GpsStatus.Listener()
{
    public void onGpsStatusChanged(int event)
    {
        switch(event)
        {
        case GPS_EVENT_STARTED:
            // do your tasks
            break;
        case GPS_EVENT_STOPPED:
            // do your tasks
            break;
        }
    }
});

コンテキストにアクセスできる必要があります (たとえば、「Activity」または「Application」クラスで)。

于 2013-04-03T04:51:19.273 に答える
7

LocationManager.PROVIDERS_CHANGED_ACTIONアクティビティのonResume()メソッドでイベントをリッスンします。

IntentFilter filter = new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION);
filter.addAction(Intent.ACTION_PROVIDER_CHANGED);
mActivity.registerReceiver(gpsSwitchStateReceiver, filter);

BroadcastReceiverのこのインスタンスをアクティビティに追加します。

private BroadcastReceiver gpsSwitchStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
    
            if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.getAction())) {

                LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                if (isGpsEnabled || isNetworkEnabled) {
                    // Handle Location turned ON
                } else {
                    // Handle Location turned OFF
                }
            }
        }
    };

onPause()アクティビティのメソッドでレシーバーを登録解除します。

mActivity.unregisterReceiver(gpsSwitchStateReceiver);
于 2019-03-08T09:12:22.570 に答える
3

これは不可能です。気まぐれでハードウェアの状態を制御/制限することはできません。これを API に含めるのは危険であり、当然のことながら、そのような API は存在しません。

于 2013-04-03T04:24:24.663 に答える
2

ActionBroadcastReceiverをリッスンするために を登録できます。これは、構成されたロケーション プロバイダーが変更されたときにブロードキャストされます。このリンクを参照できます。IntentPROVIDERS_CHANGED_ACTION

于 2013-04-03T04:41:05.967 に答える
1

次の方法で GPS の状態を検出できます。

GpsStatus.Listenerを見てください。locationManager.addGpsStatusListener(gpsStatusListener)で登録します。

理解を深めるために、この SOリンクも確認してください。

于 2013-04-03T04:50:07.637 に答える
0

API 19 以降ではBroadcastReceiver、インテント アクションをリッスンするために を登録できます。LocationManager.MODE_CHANGED_ACTION

参考:https ://developer.android.com/reference/android/location/LocationManager.html#MODE_CHANGED_ACTION

でロケーションモードを取得できます

try
{
    int locationMode = android.provider.Settings.Secure.getInt(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE);
} catch (android.provider.Settings.SettingNotFoundException e)
{
    e.printStackTrace();
}

返される値は次のいずれかです。

android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING
android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
android.provider.Settings.Secure.LOCATION_MODE_OFF
android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY
于 2016-09-13T14:17:06.760 に答える
-1

GpsStatus.Listener を使用してこれを行うことはできません。ブロードキャスト レシーバーを使用する必要があります。LocationManager.PROVIDERS_CHANGE_ACTION を使用します。Intent.ACTION_PROVIDER_CHANE を使用しないでください。幸運を !

于 2014-12-03T11:48:46.977 に答える