Как я могу проверить текущее состояние GPS-приемника? - PullRequest
87 голосов
/ 07 января 2010

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

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

Ответы [ 17 ]

1 голос
/ 10 марта 2013

Я знаю, что это немного поздно. Однако почему бы не использовать NMEAListener, если вы хотите знать, есть ли у вас исправление. Из того, что я прочитал, NMEAListener даст вам предложения NMEA, и оттуда вы выберете правильное предложение.

Предложение RMC содержит статус исправления: A для OK или V для предупреждения. Предложение GGA содержит фиксированное качество (0 недействительно, 1 GPS или 2 DGPS)

Я не могу предложить вам какой-либо Java-код, так как я только начинаю с Android, но я создал библиотеку GPS на C # для приложений Windows, которую я собираюсь использовать с Xamarin. Я только сталкивался с этой темой, потому что я искал информацию о поставщике.

Из того, что я читал до сих пор об объекте Location, мне не очень удобно пользоваться такими методами, как getAccuracy () и hasAccuracy (). Я привык извлекать из предложений NMEA значения HDOP и VDOP, чтобы определить, насколько точны мои исправления. Довольно часто иметь исправление, но с паршивым HDOP, что означает, что ваша горизонтальная точность не очень хорошая. Например, сидя за рабочим столом и отлаживая внешнее устройство Bluetooth GPS, прижавшись к окну, вы, скорее всего, получите исправление, но очень плохие HDOP и VDOP. Поместите свое устройство GPS в цветочный горшок снаружи или что-то подобное или добавьте внешнюю антенну к GPS, и вы сразу же получите хорошие значения HDOP и VDOP.

1 голос
/ 12 марта 2010

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

Это дает вам достаточно информации?

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

1 голос
/ 29 октября 2010

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

Так что вы можете просто проверить это всякий раз, когда вам нужны данные GPS, и вам не нужен этот GpsStatus.Listener.

«Глобальные» переменные:

private Location lastKnownLocation;
private long lastKnownLocationTimeMillis = 0;
private boolean isGpsFix = false;

Это метод, который вызывается из функции onLocationChanged () для запоминания времени обновления и текущего местоположения. Кроме того, он обновляет «isGpsFix»:

private void handlePositionResults(Location location) {
        if(location == null) return;

        lastKnownLocation = location;
        lastKnownLocationTimeMillis = SystemClock.elapsedRealtime();

        checkGpsFix(); // optional
    }

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

private boolean checkGpsFix(){

    if (SystemClock.elapsedRealtime() - lastKnownLocationTimeMillis < 3000) {
        isGpsFix = true;

    } else {
        isGpsFix = false;
        lastKnownLocation = null;
    }
    return isGpsFix;
}

В моей реализации я сначала запускаю checkGpsFix () и, если результат равен true, я использую переменную lastKnownLocation в качестве моей текущей позиции.

1 голос
/ 28 июня 2010

столько сообщений ...

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

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

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

0 голосов
/ 23 июля 2013

Установка временного интервала для проверки исправления не является хорошим выбором .. я заметил, что onLocationChanged не вызывается, если вы не двигаетесь .. что понятно, поскольку местоположение не меняется:)

Лучше было бы, например:

  • проверка интервала до последнего полученного местоположения (в gpsStatusChanged)
  • если этот интервал больше 15 с, установите переменную: long_interval = true
  • удалите слушателя местоположения и добавьте его снова, обычно вы получаете обновленную позицию если местоположение действительно доступно, если нет - вы, вероятно, потеряли местоположение
  • в onLocationChanged вы просто установили для long_interval значение false ..
0 голосов
/ 13 января 2010

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

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

0 голосов
/ 12 мая 2010

Вы говорите, что уже пробовали 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-отслеживания пользователем; не то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...