Как определить, когда пользователь включает/выключает состояние gps? - программирование
Подтвердить что ты не робот

Как определить, когда пользователь включает/выключает состояние gps?

Я хочу заблокировать пользователя от изменения параметров wifi, gps и загрузки из моего приложения. Пользователю не нужно включать/отключать wifi и gps во время работы моего приложения. (Из панели уведомлений). Там есть какой-либо BroadcastReceiver для прослушивания gps вкл/выкл?

Спасибо в Advance

4b9b3361

Ответ 1

Вы можете прослушивать статус GPS с помощью GpsStatus.Listener и зарегистрируйте его с помощью 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;
        }
    }
});

Вам нужно иметь доступ к контексту (например, в классе "Активность" или "Приложение" ).

Ответ 2

Ну, я много сделал, и addGpsStatusListener(gpsStatusListener) устарел в API 24. Ну, для меня это даже не работало. Вот еще одна альтернатива этому.

Если вы хотите в своем приложении прослушать изменение состояния GPS (я имею в виду On/Off by user). Широковещательный - лучший подход.

Реализация:

/**
 * 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));

Например, если вы используете в Фрагменте, зарегистрируйтесь в onResume и отмените регистрацию в onDestroy, если вы принимаете пользователя для настроек, чтобы включить переключатель местоположения. Отмена регистрации в onStop не будет работать, так как ваша активность переходит на onPause, а фрагмент остановлен.

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

Ответ 3

Это невозможно. Вы не можете контролировать/ограничивать состояние оборудования по своей прихоти. Это было бы опасно иметь в API и по праву, поэтому такой API не существует.

Ответ 4

Вы можете зарегистрировать BroadcastReceiver для прослушивания Intent Action PROVIDERS_CHANGED_ACTION. Это будет транслироваться при изменении настроенного провайдера местонахождения. Вы можете ссылаться на эту ссылку .

Ответ 5

Вы можете определить статус GPS следующим образом.

Посмотрите GpsStatus.Listener. Зарегистрируйте его с помощью locationManager.addGpsStatusListener(gpsStatusListener).

Также проверьте эту ссылку SO для лучшего понимания.

Ответ 6

Начиная с 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

Ответ 7

Вы не можете использовать GpsStatus.Listener для этого. Вы должны использовать широковещательный приемник. Используйте LocationManager.PROVIDERS_CHANGE_ACTION. Не использовать Intent.ACTION_PROVIDER_CHANE. Удачи!