Android: обнаружит, когда GPS включен/выключен (или когда приложение больше не использует его)

Я на Android 2.3.7, и я пытаюсь написать BroadcastReceiver, который будет вызван, когда пользователь включит/выключит GPS (т.е. нажав "использовать GPS-спутники" в настройках.

Что я сделал до сих пор:

1) Создал следующий широковещательный приемник:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Toast.makeText(arg0, "Broadcast received!", Toast.LENGTH_SHORT).show();

    }
}

2) Добавил это в манифест андроида, внутри тегов:

<receiver android:name=".GPSStatusBroadcastReceiver"> 
    <intent-filter> 
        <action android:name="android.location.PROVIDERS_CHANGED" /> 
    </intent-filter> 
</receiver>

Теперь проблема заключается в том, что она кажется не надежной. Когда я включаю GPS on/ff, метод onReceive() работает только иногда (я бы сказал, 1 раз из 3), в другое время, когда он не вызван.

Я хочу знать, есть ли надежный способ обнаружить, когда GPS выключен/включен.

Если нет, было бы неплохо получить уведомление по крайней мере, если ни одно приложение не использует GPS-навигатор (т.е. когда значок gps исчезает из строки состояния, указывая, что никто не активно находит).

EDIT: Уточнение: я не хочу этого делать, пока мое приложение работает. Я просто, что мое приложение запускается, когда gps включен/выключен, выполняет свою работу, а затем завершает работу, я не хочу подписываться на LocationsUpdates...

Ответ 1

На уровне API 9 и выше вы можете использовать LocationManager.PROVIDERS_CHANGED_ACTION:

Действие трансляции, когда настроенные поставщики местоположения меняются. Для использования с isProviderEnabled(String). Если вы взаимодействуете с LOCATION_MODE API, используйте MODE_CHANGED_ACTION.

Постоянное значение: "android.location.PROVIDERS_CHANGED"

Источник

Ответ 2

Следующее решение может быть странным решением, но вы можете попробовать его, если не найдете решения. Еще одна проблема с вашим решением заключается в том, что он работает только после уровня api 9.

в потоке или службе вы можете периодически проверять состояние gps с очень коротким интервалом, используя

 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
 boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

он будет использовать разрешение

android.permission.ACCESS_FINE_LOCATION

Несмотря на то, что я отвечаю на это, для меня это не должно быть хорошим решением. Также существует вероятность задержки минимального периода. Просто вариант.

Ответ 3

Начиная с API 19 вы можете прослушивать действие намерения LocationManager.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

Ответ 4

Используйте LocationListener и переопределите OnStatusChanged.

Вы можете присоединить своего слушателя, используя метод requestLocationUpdates(String, long, float, LocationListener) на вашем экземпляре LocationManager.