Получение последнего местоположения, так много способов

Когда я просматриваю руководства по Android и/или официальную документацию Android, мне кажется, что существует несколько разных способов запроса местоположения. Я в замешательстве, так как не уверен, какой путь правильный или документация устарела.

Например,

1) GoogleApiClient: таким образом, он использует клиент API Google.

 mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();

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

LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

2) Диспетчер местоположений: этот способ использует диспетчер местоположений.

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

3) FusedLocationApi (2-й стиль):

mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mFusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations, this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

Какой путь мы должны использовать?


person Snake    schedule 28.12.2017    source источник


Ответы (1)


FusedLocationProvider — это лучший способ узнать местоположение в Android прямо сейчас. Вы упомянули два способа использования FusedLocationManager

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

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

 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
 mFusedLocationClient.getLastLocation()
    .addOnSuccessListener(this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            // Got last known location. In some rare situations this can be null.
            if (location != null) {
                // Logic to handle location object
            }
        }
    });

В приведенном выше подходе вы регистрируете прослушиватель fusedlocationListener, который при успешной регистрации вызовет метод onSuccess и предоставит объект местоположения, который здесь снова может быть нулевым. Обычно в случаях перезагрузки устройства последнее известное местоположение равно нулю. Есть и другие случаи. также. Я бы посоветовал вам использовать второй подход, так как он использует fusedlocationprovider для получения последнего известного местоположения, так как это более эффективно.

person Pramod Yadav    schedule 28.12.2017
comment
Итак, вы говорите, что подход LocationManager устарел и просто больше не рекомендуется только потому, что fusedLocation новее. Правильный? Кроме того, почему вы должны использовать mFusedLocationClient, а не GoogleApiClient, поскольку оба являются fusedLocation? - person Snake; 28.12.2017
comment
Кстати, получение Null не в редких случаях. Простое отключение службы определения местоположения в настройках также приведет к нулю, что в большинстве случаев - person Snake; 28.12.2017
comment
mfusedlocationclient - это абстрактный способ, который предоставляет вам fusedlocationprovider, который вы можете напрямую использовать при использовании googleapiclient, который вам нужен для управления соединением, а затем отключать соединение, когда действие или фрагмент уничтожаются, в котором вы установили соединение - person Pramod Yadav; 28.12.2017