Настройки приложения 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 CallBack никогда не работал. Я не смог найти никаких журналов на logcat. Для меня это похоже на проблему реализации.
Вот как воспроизвести проблему.
Выключи свой GPS. Попробуйте вызвать метод, и он отлично работает, как ожидалось. Он просит меня переключить GPS. Как только вы получите обновление местоположения, снова отключите GPS и вызовите этот метод. Я никогда не получаю диалог для включения GPS. Я вызываю этот метод по нажатию кнопки, которая пытается получить последнее местоположение пользователя.
РЕДАКТИРОВАТЬ: я пытался объявить PendingResult результат как переменную класса. Все еще не повезло. Я также попытался инициализировать результат только один раз, проверив, является ли он нулевым, как и ожидалось, и, как упоминалось в документации Google, он выдает исключение, указывающее, что результат уже использован.
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;
}
}
});
}