Как я могу проверить текущий статус GPS-приемника?

Как я могу проверить текущий статус GPS-приемника? Я уже проверил LocationListener onStatusChanged метод, но так или иначе кажется, что это не работает, или просто неправильная возможность.

В основном я просто должен знать, мигает ли значок GPS наверху экрана (не фактическая фиксация) или тело (фиксация доступна).

88
задан Jason Plank 8 November 2011 в 13:19
поделиться

7 ответов

Хорошо, давайте попробуем комбинацию всех ответов и обновлений и сделаем что-то вроде этого:

GPS-приемник может быть чем-то вроде этого:

GpsStatus.Listener listener = new GpsStatus.Listener() {
    void onGpsStatusChanged(int event) {
        if (event == GPS_EVENT_SATELLITE_STATUS) {
            GpsStatus status = mLocManager.getGpsStatus(null);
            Iterable<GpsSatellite> sats = status.getSatellites();
            // Check number of satellites in list to determine fix state
        }
    }
}

API немного неясны о том, когда и какая информация о GPS и спутниках дается, но я думаю, что идея будет заключаться в том, чтобы посмотреть, сколько спутников доступно. Если их меньше трех, то исправить это невозможно. Если их больше, то у вас должно быть исправление.

Проба и ошибка - это, вероятно, способ определить, как часто Android сообщает информацию о спутниках, и какую информацию содержит каждый объект GpsSatellite.

.
14
ответ дан 24 November 2019 в 07:27
поделиться

Вы можете попробовать использовать LocationManager.addGpsStatusListener для получения обновленной информации при изменении GPS-статуса. Похоже, что GPS_EVENT_STARTED и GPS_EVENT_STOPPED могут быть тем, что вы ищете.

.
2
ответ дан 24 November 2019 в 07:27
поделиться

Может быть, это лучшая возможность создать задание TimerTask, которое регулярно устанавливает полученное местоположение на определенное значение (нулевое?). Если новое значение получено GPSListener, то оно будет обновлять местоположение с текущими данными.

Я думаю, что это будет рабочим решением.

0
ответ дан 24 November 2019 в 07:27
поделиться

С помощью LocationManager вы можете получитьLastKnownLocation () после того, как получитеBestProvider (). Это дает вам объект Location, у которого есть методы getAccuracy () в метрах и getTime () в миллисекундах UTC

Достаточно ли это информации?

Или, возможно, вы могли бы перебрать LocationProvider и выяснить, соответствует ли каждый из них критериям (ACCURACY_COARSE)

1
ответ дан 24 November 2019 в 07:27
поделиться

Вы говорите, что уже пробовали onStatusChanged (), но у меня это работает.

Вот метод, который я использую (я позволяю самому классу обрабатывать onStatusChanged):

private void startLocationTracking() {
    final int updateTime = 2000; // ms
    final int updateDistance = 10; // meter
    final Criteria criteria = new Criteria();
    criteria.setCostAllowed(false);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    final String p = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(p, updateTime, updateDistance,
            this);
}

И я обрабатываю onStatusChanged следующим образом:

void onStatusChanged(final String provider, final int status,
        final Bundle extras) {
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "No Service";
            location = null;
        }
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "no fix";
        }
        break;
    case LocationProvider.AVAILABLE:
        statusString = "fix";
        break;
    }
}

Обратите внимание, что методы onProvider {Dis, En }abled () предназначены для включения и отключение пользователем GPS слежения; не то, что вы ищете.

0
ответ дан 24 November 2019 в 07:27
поделиться

так много сообщений ...

GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
                        public void onGpsStatusChanged(int event) {
                            if( event == GpsStatus.GPS_EVENT_FIRST_FIX){
                                showMessageDialog("GPS fixed");
                            }
                        }
                 };

добавление этого кода с помощью addGpsListener ... showMessageDialog ... просто показывает стандартное диалоговое окно со строкой

отлично для меня сработало :) большое спасибо: =) (простите за этот пост, пока не могу проголосовать)

1
ответ дан 24 November 2019 в 07:27
поделиться

После нескольких лет работы с GPS на Windows Mobile я понял, что концепция «потери» исправления GPS может быть субъективной. Чтобы просто послушать, что вам сообщает GPS, добавив NMEAListener и проанализировав предложение, вы узнаете, было ли исправление «действительным» или нет. См. http://www.gpsinformation.org/dale/nmea.htm#GGA . К сожалению, у некоторых GPS-приемников это значение будет колебаться взад и вперед даже во время нормального режима работы в зоне «хорошего исправления».

Итак, другое решение - сравнить время в формате UTC местоположения GPS со временем телефона (преобразованным в UTC). Если между ними есть определенная разница во времени, можно предположить, что вы потеряли координаты GPS.

8
ответ дан 24 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: