попытка получить наиболее точное местоположение устройства с помощью GPS или сети в Android

StackOverflow https://stackoverflow.com/questions/2428729

Вопрос

Я пытаюсь определить наиболее точное местоположение устройства в кратчайшие возможные сроки.

Я сохраняю данные в виде географической точки и отображаю их на mapview.

В последний раз, когда я активировал GPS на своем устройстве и позволил ему зафиксировать местоположение, я был примерно в 80 милях от того места, где нахожусь сейчас.

У меня есть настройка диспетчера местоположений и прослушивателя местоположений.

Если я сделаю это, я получу NULL.

  myLocOverlay = new MyLocationOverlay(this, mapView);
  GeoPoint test = myLocOverlay.getMyLocation();

но в следующих двух строках;

  myLocOverlay.enableMyLocation();      
  mapView.getOverlays().add(myLocOverlay);

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

Если я построю геопункт следующим образом;

    if(lm.getLastKnownLocation("gps") != null) 
    {
     test = new GeoPoint(
        (int) (lm.getLastKnownLocation("gps").getLatitude() * 1E6), 
        (int) (lm.getLastKnownLocation("gps").getLongitude() * 1E6));
    }

    else
    {

    if(lm.getLastKnownLocation("network") != null) 
    {
     test = new GeoPoint(
       (int) (lm.getLastKnownLocation("network").getLatitude() * 1E6), 
       (int) (lm.getLastKnownLocation("network").getLongitude() * 1E6));
    }
    //bad things
    }

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

Я хочу избежать вышеуказанных результатов, и поэтому рассматривал возможность использования;

GeoPoint test = myLocOverlay.getMyLocation();

НО, как я уже сказал выше, я просто получаю NULL от этого.

Если не считать получения геопоинт как с GPS, так и с сети, а затем сравнения их и игнорирования результата GPS, если он находится, скажем, в 1 миле от сетевого местоположения - я немного застрял.почему getMyLocation() не работает, разве это не должно возвращать географическую точку того, что myLocOverlay показывает на mapview?

Это было полезно?

Решение

Он может возвращать значение null, поскольку еще не получил исправления.Вы должны зарегистрировать LocationListener который принимает обновления как из сетевых, так и из GPS-источников.Затем, когда вы получите обновление местоположения, вы сможете посмотреть на точность определения местоположения и решить, хотите ли вы его использовать.

Другие советы

Я бы предположил, что вы слишком быстро запрашиваете географическую точку.MyLocationOverlay будет использовать свои собственные прослушиватели для извлечения исправления.И, возможно, он запрашивает исправление gps, смотря, сколько ему лет, затем, если оно слишком старое, получает исправление сети и использует его в ожидании исправления gps.

Это означает взаимодействие с чипсетом gps, gsm-модемом и веб-серверной частью в фоновом режиме.
Это будет невозможно за то время, пока вашей программе нужно перейти к следующей строке.

В пользовательском интерфейсе это будет выглядеть довольно мгновенно, но это измеряется человеческими глазами.

Вы могли бы воспользоваться ответом от CaseyB и зарегистрировать свой собственный GPS-прослушиватель у обоих провайдеров и решить для себя, какой координаты вы хотите использовать.Если вы хотите это сделать, существуют методы для определения времени последнего исправления (Location.getTime()) и точности для местоположений.

Вторая возможность состоит в том, чтобы немного подождать и посмотреть, возвращает ли вызов по-прежнему null, если да, то подождите еще немного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top