Как получить 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 шт):

Автор решения: Sergei Buvaka
  • В настоящее время 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
                // ...
            }
        }
    };
    
→ Ссылка