0

У меня есть простой менеджер местоположений, который обычно работает, однако, когда устройство Android выключено, а затем снова включено, диспетчер местоположений android возвращает Null, даже если у меня есть запрос на обновления. Я знаю, что getLastKnownLocation может возвращать значение null, однако, я считаю, что обрабатываю это в своем коде. Все предложения приветствуются.Android Location Manager возвращает NULL

По-видимому, lon = location.getLongitude(); рушится.

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location == null) 
     { 
      // request location update!! 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      lon = location.getLongitude(); 
      lat = location.getLatitude(); 
     } 


     mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     //Get last known location 
     location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     //Update if not null 
     if (location != null) 
     { 
      lat = location.getLatitude(); 
      lon = location.getLongitude(); 
     } 
     //Request update as location manager can return null otherwise 
     else 
     { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      lat = location.getLatitude(); 
      lon = location.getLongitude(); 
     } 
    } 
+0

Это глупый вопрос, но до сих пор вы добавили разрешения <использует-разрешение андроида: имя = «android.permission.ACCESS_FINE_LOCATION» /> <использует-разрешение андроида: имя = "андроид. разрешение.INTERNET "/> – Soham

+0

У меня есть, что да! : D – ThemuRR

ответ

1

Единственная проблема заключалась в том, что на телефоне Android был включен режим самолета. Сейчас я немного смущен!

2

андроида менеджер место возвращает Null, даже если он у меня запрашивают обновления

Правильно. Запрос на обновления запросов, которые Android запускает, пытаясь выяснить, где находится устройство. Это займет некоторое время. В то же время getLastKnownLocation() может очень хорошо вернуться null.

getLastKnownLocation() обычно полезен, если вы хотите знать местоположение, но если эти данные не готовы, вы можете двигаться без него. Если вам нужно место, и getLastKnownLocation() возвращает null, вам нужно будет подождать Location, пока не назовется onLocationChanged(). Обратите внимание: onLocationChanged() никогда не может быть вызван, так как нет требования, чтобы у пользователя были какие-либо поставщики местоположения, и нет требования, чтобы устройство было в состоянии фактически получить исправления местоположения.

1

Я видел ваш ответ в режиме самолета, но в вашем коде у вас есть плохие практики.

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location == null) 
     { 
      // request location update!! 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      lon = location.getLongitude(); 
      lat = location.getLatitude(); 
     } 

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

 mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     //Get last known location 
     location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     //Update if not null 
     if (location != null) 
     { 
      lat = location.getLatitude(); 
      lon = location.getLongitude(); 
     } 
     //Request update as location manager can return null otherwise 
     else 
     { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      lat = location.getLatitude(); 
      lon = location.getLongitude(); 
     } 
    } 

Даже здесь, в «другом» Клаусе, вы не можете получить доступ к местоположению сразу. это означает, что вы не можете сразу получить местоположение (оно просто удерживает последнее значение).
Что вы должны сделать, это реализовать метод onLocationChanges и разместить там асинхронный путь. как это:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

    if (location != null) 
    { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
    } 
    else 
    { 
     mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
    } 

} 

@Override 
public void onLocationChanged(Location location) { 
    lat = location.getLatitude(); 
    lon = location.getLongitude(); 
} 
+1

Большое спасибо за ваш совет, я обязательно поменяю свой код соответствующим образом! – ThemuRR

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