ユーザーが WiFi や GPS を変更したり、アプリケーションから設定を読み込んだりできないようにしたいと考えています。ユーザーは、アプリケーションの実行中に WiFi と GPS をオン/オフする必要はありません (通知バーから)。BroadcastReceiver
GPS のオン/オフをリッスンするものはありますか?
11 に答える
さて、私は多くの掘り下げを行い 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
このソリューションには多くの答えがあるかもしれませんが、これは管理と使用が簡単です。解決策があれば提案します。
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」クラスで)。
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);
これは不可能です。気まぐれでハードウェアの状態を制御/制限することはできません。これを API に含めるのは危険であり、当然のことながら、そのような API は存在しません。
ActionBroadcastReceiver
をリッスンするために を登録できます。これは、構成されたロケーション プロバイダーが変更されたときにブロードキャストされます。このリンクを参照できます。Intent
PROVIDERS_CHANGED_ACTION
次の方法で GPS の状態を検出できます。
GpsStatus.Listenerを見てください。locationManager.addGpsStatusListener(gpsStatusListener)で登録します。
理解を深めるために、この SOリンクも確認してください。
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
GpsStatus.Listener を使用してこれを行うことはできません。ブロードキャスト レシーバーを使用する必要があります。LocationManager.PROVIDERS_CHANGE_ACTION を使用します。Intent.ACTION_PROVIDER_CHANE を使用しないでください。幸運を !