SettingsApi Android FusedLocation не работает более одного раза

У FusedLocation есть замечательный API для проверки того, включил ли пользователь все соответствующие настройки для получения местоположения. Я следил за документацией https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi, чтобы запустить SettingsApi. Мой код для проверки настроек пользователя приведен ниже.

private void checkLocationSetting()
{
    if (mLocationSettingsRequest == null)
    {
        mLocationSettingsRequest =
                new LocationSettingsRequest.Builder()
                        .addLocationRequest(mLocationRequest)
                        .setAlwaysShow(true)
                        .build();
    }

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest);

    result.setResultCallback(new ResultCallback<LocationSettingsResult>()
    {
        @Override
        public void onResult(LocationSettingsResult result)
        {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode())
            {
                case LocationSettingsStatusCodes.SUCCESS:
                {
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    requestNewLocationBySettingLocationReq();
                    break;
                }
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                {
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try
                    {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(SpotToiletMap.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException e)
                    {
                        // Ignore the error.
                    }
                    break;
                }
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                {
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    MiscellaneousMethods.showGenericSnackBar(rootView, getString(R.string.location_settings_unavailable));
                    break;
                }
            }
        }
    });
}

Этот фрагмент кода отлично работает в первый раз. Впоследствии обратный вызов PendingResult никогда не работал. Я также не смог найти никаких журналов на logcat. Для меня это похоже на проблему реализации.

Вот как воспроизвести проблему.

Выключите GPS. Попробуйте вызвать метод, и он отлично работает, как и ожидалось. Он просит меня переключить GPS. Как только вы получите обновление местоположения, снова выключите GPS и вызовите этот метод. Я никогда не получаю диалог для включения GPS. Я вызываю этот метод нажатием кнопки, которая пытается получить последнее местоположение пользователя.

РЕДАКТИРОВАТЬ: я попытался объявить результат PendingResult как переменную класса. Все равно не повезло. Я также попытался инициализировать результат только один раз, проверив, является ли он нулевым, как и ожидалось, и, как указано в документации Google, он выдает исключение, в котором упоминается, что результат уже использован.


person rakesh kashyap    schedule 01.07.2016    source источник
comment
Какую версию сервисов Google Play вы используете в своем приложении и какую версию сервисов Google Play вы установили на устройство во время тестирования?   -  person Daniel Nugent    schedule 03.07.2016
comment
На моем устройстве у меня есть сервис Google Play 9.2.56, а в моем приложении я использую 9.0.2.   -  person rakesh kashyap    schedule 03.07.2016
comment
@DanielNugent Теперь я попытался обновить свое приложение, чтобы использовать последнюю версию 9.2.0. Все та же проблема   -  person rakesh kashyap    schedule 03.07.2016
comment
Также какая версия Android на устройстве?   -  person Daniel Nugent    schedule 03.07.2016
comment
пробовал на 4.4.2 и 4.4.4,   -  person rakesh kashyap    schedule 03.07.2016


Ответы (1)


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

У меня все заработало, проверено на Android 4.4.4 и 6.0.1.

Диалог отображается каждый раз при нажатии кнопки (при условии, что на устройстве между нажатиями кнопки отключена функция «Местоположение»):

public void checkLocationSetting() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    //...
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_LOCATION);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    //...
                    break;
            }
        }
    });

}
person Daniel Nugent    schedule 03.07.2016
comment
Я пытался повторно инициализировать Builder каждый раз. Тем не менее, я не могу заставить эту штуку работать во второй раз. На самом деле я пробовал на 3 разных устройствах. тот же результат на всех 3. Я также пытался повторно запустить mLocationRequest ... тоже не сработало. - person rakesh kashyap; 04.07.2016
comment
После создания еще одного простого действия без какой-либо моей бизнес-логики я смог указать, в чем проблема. в моем onLocationChanged() я останавливаюLocationUpdates. который отключает mGoogleApiClient. Если mGoogleApiClient не подключен, это не сработает. вот моя суть gist.github.com/rakesh1988/03cd9f909542f7b078c921093ef9ade9 - person rakesh kashyap; 04.07.2016