пытаясь получить наиболее точное местоположение устройства из GPS или сети в Android - PullRequest
3 голосов
/ 12 марта 2010

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

Я сохраняю данные как геопункт и отображаю их в виде карты.

В последний раз, когда я активировал 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 () не работает, разве это не должно возвращать GeoPoint того, что myLocOverlay показывает на виде карты?

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

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

2 голосов
/ 12 марта 2010

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

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

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

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

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

...