web-dev-qa-db-ja.com

ユーザーがGPSの状態をオン/オフにしたことを検出するにはどうすればよいですか?

ユーザーがアプリケーションからWiFi、GPS、およびロード設定を変更できないようにしたい。アプリケーションの実行中に、ユーザーはWiFiとGPSをオン/オフにする必要はありません(通知バーから)。 GPSのオン/オフを聞くためのBroadcastReceiverはありますか?

21
Devu Soman

よく調べたところ、API 24ではaddGpsStatusListener(gpsStatusListener)が廃止されていることがわかりました。私にとっては、これも機能しませんでした。そこで、これに対する別の代替ソリューションを次に示します。

アプリ内にある場合は、GPSの状態変化(つまり、ユーザーによるオン/オフ)を聞く必要があります。 Broadcastを使用するのが最善の方法です。

実装:

/**
 * 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.
        }
    }
};

フラグメント/アクティビティライフサイクルでも、これを効率的に登録および登録解除することを忘れないでください。

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

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

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

32
sud007

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;
        }
    }
});

コンテキストにアクセスする必要があります(「アクティビティ」または「アプリケーション」クラスなど)。

23
luxer

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

3
JoxTraex

BroadcastReceiverをリスニングするためにIntentを登録できます_アクションPROVIDERS_CHANGED_ACTION。これは、構成された位置プロバイダーが変更されたときにブロードキャストされます。これを参照できます link

2
Aju

聞く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);
2
matdev

GPSの状態は以下の方法で検出できます。

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

また、SO link も確認してください。

1
Rahil2952

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
0
ARLabs