ユーザーがアプリケーションからWiFi、GPS、およびロード設定を変更できないようにしたい。アプリケーションの実行中に、ユーザーはWiFiとGPSをオン/オフにする必要はありません(通知バーから)。 GPSのオン/オフを聞くためのBroadcastReceiver
はありますか?
よく調べたところ、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
に移動し、フラグメントが停止するためです。
このソリューションには多くの答えがあるかもしれませんが、これは管理と使用が簡単です。もしあればソリューションを提案します。
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;
}
}
});
コンテキストにアクセスする必要があります(「アクティビティ」または「アプリケーション」クラスなど)。
これは不可能です。気まぐれなハードウェアの状態を制御/制限することはできません。これはAPIに含めるのは危険であり、当然のことながら、そのようなAPIは存在しません。
BroadcastReceiver
をリスニングするためにIntent
を登録できます_アクションPROVIDERS_CHANGED_ACTION
。これは、構成された位置プロバイダーが変更されたときにブロードキャストされます。これを参照できます link 。
聞く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);
GPSの状態は以下の方法で検出できます。
GpsStatus.Listener を見てください。これをlocationManager.addGpsStatusListener(gpsStatusListener)に登録します。
また、SO link も確認してください。
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