Как получить Location?
Занимаюсь по учебнику "Android. Программирование для профессионалов" (3-е издание 2017 года), там есть такое место:
LocationRequest request = LocationRequest.create();
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
request.setNumUpdates(1);
request.setInterval(0);
LocationServices.FusedLocationApi
.requestLocationUpdates(mClient, request, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
Проблема в том, что после запуска, никакого сообщения с Location в логах не появляется. То есть в onLocationChanged программа не попадает вообще.
В документации, я нашёл такой вариант получения Location:
LocationServices.getFusedLocationProviderClient(getContext())
.getLastLocation()
.addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
Но он возвращает null.
В чём может быть ошибка? Или можно как-то ещё получить Location?
Ответы (1 шт):
В настоящее время
FusedLocationProviderбудет поддерживать фоновое получение геолокации, только если к нему подключен хотя бы один клиент. Как только первый клиент подключится, он сразу попытается найти местоположение. Если вашаActivityявляется первым клиентом, подключившимся, и вы сразу же вызываетеgetLastLocation()вonConnected(), может не хватить времени для входа получения первых данных о локации.getLastLocation()подходит для случаев, когда местоположение требуется немедленно или не может использоваться вообще. Если вы действительно хотите дождаться данных о геолокации, лучше использоватьrequestLocationUpdates()и ждать колбека. Если вам нужно только единичный запрос на геолокацию, вы можете указать это вLocationRequest, и запрос будет автоматически удален, как только появится ваше обновление.LocationServices.FusedLocationApi- если вы заглянете в код то увидете:/** @deprecated */ @Deprecated public static final FusedLocationProviderApi FusedLocationApi;т.е. его так же не рекомендуется использовать.
Если вы полезете в документацию по Request location updates там есть пример получения геолокации:
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } } private void startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); }Определение колбека получения геолокации:
private LocationCallback locationCallback; // ... @Override protected void onCreate(Bundle savedInstanceState) { // ... locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { // Update UI with location data // ... } } };