Почему метод getLastLocation() не получает местоположение при первом запуске приложения?

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

Я использую этот код:

@Override
    public void onConnected(@Nullable Bundle bundle) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
            currentLatDouble = mLastLocation.getLatitude();
            currentLngDouble = mLastLocation.getLongitude();
        }
    }

Я использую Snackbar, который появляется, когда местоположение не обнаружено, и имеет кнопку «ПОВТОРИТЬ». При нажатии этой кнопки «ПОВТОРИТЬ» приведенный выше код выполняется снова, и на этот раз местоположение извлекается.

Я хочу получить местоположение, как только приложение будет запущено.

Пожалуйста, дай мне знать.


person Hammad Nasir    schedule 13.07.2016    source источник
comment
Ответ, как обычно... потому что getLastLocation МОЖЕТ вернуть null...   -  person Selvin    schedule 13.07.2016
comment
@Selvin, почему он возвращает ноль каждый раз, когда приложение запускается, а не со второй попытки?   -  person Hammad Nasir    schedule 13.07.2016
comment
Это может быть время для устройства, чтобы получить некоторую позицию и установить в качестве последнего известного местоположения.   -  person Diego Malone    schedule 13.07.2016
comment
@DiegoMalone, как мне избежать такого поведения и получить местоположение при запуске приложения?   -  person Hammad Nasir    schedule 13.07.2016
comment
@HammadNasir Я ответил на вопрос, пожалуйста, посмотрите ответ.   -  person Diego Malone    schedule 13.07.2016
comment
пожалуйста, проверьте этот ответ для пошагового руководства по местоположению. stackoverflow.com/a/38397092/5955362   -  person Jaydeep Devda    schedule 16.07.2016
comment
@jaydeeppatel, вы тоже можете помочь с этим: достичь?noredirect=1#comment64189423_38389215" title="как получить сообщения, которые находятся в пределах 0,5 км от моей досягаемости"> stackoverflow.com/questions/38389215/   -  person Hammad Nasir    schedule 16.07.2016


Ответы (1)


Метод LocationServices.FusedLocationApi.getLastLocation может вернуть null, если еще нет последнего известного местоположения.

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

@Override
public void onConnected(Bundle connectionHint) {
    ...
    if (mRequestingLocationUpdates) {
        startLocationUpdates();
    }
}

protected void startLocationUpdates() {
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
}

И LocationListener обработает полученное местоположение

public class MainActivity extends ActionBarActivity implements LocationListener {
...
@Override
public void onLocationChanged(Location location) {
    mCurrentLocation = location;
}

Обязательно ознакомьтесь с документацией. Этот ответ также может вам помочь.

person Diego Malone    schedule 13.07.2016
comment
Я не знаю почему, но местоположение не восстанавливается при запуске приложения и восстанавливается со второй попытки! - person Hammad Nasir; 14.07.2016
comment
Это связано с тем, что при запуске приложения запрос к последнему местоположению выполняется до того, как оно сможет получить исправление местоположения. В последующих попытках у него достаточно времени, чтобы исправить ситуацию. Если вы поместите действие повторной попытки сразу после инициализации, возможно, во втором вызове, у него все равно не будет позиции. Лучший способ — запросить позицию, и как только устройство получит позицию, вы примете ее за первую известную позицию. - person Diego Malone; 15.07.2016