Android: определить, что пользователь открывает строку состояния

Я пишу приложение, которое использует GPS для служб локализации. Когда пользователь пытается использовать приложение с отключенным GPS, появляется диалоговое окно. Теперь пользователь может свернуть приложение и изменить настройки GPS. Когда он снова открывает приложение, оно обнаруживает в onResume(), что настройки были изменены, и закрывает диалоговое окно. Это прекрасно работает, но у пользователя есть второй способ включить GPS: строка состояния. Когда строка состояния открывается и закрывается, ни onResume(), ни onWindowFocusChanged() не вызываются, поэтому я не определяю, когда пользователь включил GPS.

Есть ли способ обнаружить открытие строки состояния?

Я мог бы сделать это через LocationListener, но я хотел бы сделать это так, как я написал выше.

Заранее спасибо!


Я нашел помощь в android-dev IRC. Теперь я использую Observer, чтобы отслеживать изменения настроек, как здесь. Таким образом, я обнаруживаю все изменения настроек, даже если они выполняются через панель уведомлений, не запрашивая обновления у LocationManager. Спасибо за вашу помощь!


person hicks    schedule 06.10.2011    source источник


Ответы (3)


Для прослушивания GPS, который включил пользователь, с помощью строки состояния вы можете настроить прослушиватель изменений через диспетчер местоположения:

private class DisabledGPSListener implements LocationListener{

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        locationManager.removeUpdates(this);
        locationManager.addGpsStatusListener(gpsStatusListener);
    }

установите этот слушатель внутри onCreate()

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
    locationManager.addGpsStatusListener(gpsStatusListener);
}else{
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, new DisabledGPSListener());
}

где gpsStatusListener является экземпляром:

    private class GPSStatuslistener implements GpsStatus.Listener {

    @Override
    public void onGpsStatusChanged(int event) {
        switch (event) {
        case GpsStatus.GPS_EVENT_STARTED:
            Log.d(TAG, "ongpsstatus changed started");
            //TODO: your code that get location updates, e.g. set active location listener 
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            Log.d(TAG, "ongpsstatus changed stopped");
            createGpsDisabledAlert();
        }
    }
person Denis Nek    schedule 31.05.2012

Вы ищете LocationManager.addGpsStatusListener?

person slkorolev    schedule 06.10.2011
comment
Я думал, что оба управляются одним и тем же движком... Сейчас не могу проверить - person slkorolev; 07.10.2011
comment
Спасибо за быстрый ответ, но нет, я так не думаю. Этот слушатель обнаруживает только изменения GPS, верно? Он не обнаруживает включенных провайдеров. Кстати, я использую GPS и AGPS (забыл добавить). И на самом деле я не хочу использовать прослушиватель GPS; Я хочу определить, когда пользователь открывает строку состояния. Я думаю, что это снижает потребление батареи (вместо того, чтобы запрашивать обновления у LocationManager). -удалил свой первый комментарий, не торопился редактировать- - person hicks; 07.10.2011
comment
Возможно, это тот же движок, но движок не запускается, когда пользователь просто включает GPS. Итак, onGpsStatusChanged(int event) не звонят. - person hicks; 07.10.2011

Это не решает вашу проблему напрямую, но вам может быть проще открыть настройки для пользователя:

startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0);
person Ian    schedule 06.10.2011
comment
Я подумаю об этом, но на самом деле я не очень хочу заставлять пользователя включать GPS. Я просто хочу замечать, когда он это делает. - person hicks; 07.10.2011
comment
Хорошо, просто проверьте OnResume() и отобразите диалоговое окно. В этом диалоговом окне можно включить GPS (таким образом, запустив это действие) или закрыть диалоговое окно. - person Ian; 07.10.2011
comment
Да, но пользователь по-прежнему может открыть строку состояния, чтобы включить GPS, и приложение этого не заметит. Итак, никто не знает, как определить, что пользователь открывает/закрывает строку состояния?? - person hicks; 07.10.2011