2014-03-10 3 views
2

Я знаю, что об этом говорили много раз, но ничто не помогло мне устранить проблему, из-за которой getLastKnownLocation возвращает null.getLastKnownLocation возвращает null в Android

Моя активность реализации LocationListener:

public class MainActivity extends Activity implements 
    GooglePlayServicesClient.ConnectionCallbacks, 
    GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { 

У меня есть это в моем OnCreate метод:

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

И я затем попытаться получить местоположение пользователя, как это (также в OnCreate):

// Getting the Co-ordinates of the users current location 
    Location location = lm 
      .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

    if(location != null){ 
     longitude = location.getLongitude(); 
     latitude = location.getLatitude(); 
    } 

Я попробовал тогда:

@Override 
public void onLocationChanged(Location location) {  
    longitude = location.getLongitude(); 
    latitude = location.getLatitude(); 
} 

Я что-то не хватает?

EDIT: До сих пор не работает, но код, который я пробовал:

if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    while (location == null) { 
     if (counter > MAX_TIME) { 
     } 
     else { 
      try { 
       location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      counter += 1000; 
     } 
    } 
    } 

ответ

1

Из документации: «Возвращает местоположения, указывающие данные из последнего известных затруднительного местоположения, полученные от данного поставщика

Возвращают последнее известное место для поставщика, или нулевая »

Таким образом, с использованием поставляемого поставщика должно быть как минимум одно предыдущее местоположение. Чтобы получить это местоположение, вы должны регистрироваться на обновления хотя бы один раз с использованием этого провайдера и получать фактическое обновление. После этого getLastKnownLocation вернет это значение. Если вы хотите зарегистрироваться для местоположений, предоставляемых другими приложениями, используйте Location.PASSIVE_PROVIDER.

Надеюсь, это поможет.

Редактировать: Как я уже отмечал выше, поставьте цикл while, в котором итерации говорят в течение 30 секунд, и проверяет каждую секунду, если местоположение больше не равно null. Вам нужно, чтобы это произошло хотя бы один раз, чтобы затем использовать getLastKnownLocation, AFAIK.

Редактировать небольшим непроверенным примером. Лучше всего положить все это в AsyncTask, т. Е. В doInBackground.Обратите внимание, я предполагаю, что вы храните сам расположение объекта, а не разделяя его на долготу и широту .:

if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    long final MAX_TIME = 30000; 
    long counter = 0; 
    while (location == null) { 
     if (counter > MAX_TIME) { 
      return False; 
     } 
     Thread.sleep(1000); 
     counter += 1000; 
    } 
} else { 
    return False; 
} 

Edit: Remember, Location обновляется в onLocationUpdate (Место нахождения). Один из них был обновлен, тогда у вас есть объект местоположения, не равный нулю.

+0

К сожалению, это просто время и место остается в нуле –

+0

Убедитесь, что провайдер местоположения включен в первую очередь. Я обновил сообщение. –

+0

Кроме того, убедитесь, что у вас есть правильные разрешения разрешений (FINE_LOCATION). –

1

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

Если вы вызываете напрямую getLastLocation, он вернет вам последнее местоположение поиска или когда-нибудь null, если нет места кеша. Это всегда хорошо, если вы внедряете службу определения местоположения и пытаетесь получить местоположение onLocationChanged. Вы можете сохранить эту переменную как статическую для доступа в других классах.

Когда-нибудь, поставщик GPS не в состоянии получить местоположение, когда вы находитесь в здании, так в этом случае вы можете переключиться на сети провайдера, чтобы получить место, но в провайдера сети accurary будет меньше, так как Comparision к поставщику GPS

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

+1

Лучше всего реализовать цикл здесь, который проверяет каждую секунду или около того, чтобы узнать, больше ли это местоположение, но с ограничением по времени (скажем, 30 секунд). –

+0

@confused_at_times есть пример цикла, пожалуйста? –

+0

@NatalieCarr Сделали ли вы услугу определения местоположения? –

Смежные вопросы