Часть моего приложения требует служб определения местоположения, поэтому, если местоположение в настоящее время отключено, приложение предложит пользователю включить его. Вот как я это делаю: (Также см. в этом Ответ на переполнение стека)
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
builder.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>()
{
@Override
public void onResult(LocationSettingsResult result)
{
final Status status = result.getStatus();
final LocationSettingsStates = result.getLocationSettingsStates();
switch (status.getStatusCode())
{
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can initialize location
// requests here.
...
Log.d("onResult", "SUCCESS");
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
Log.d("onResult", "RESOLUTION_REQUIRED");
try
{
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(OuterClass.this, REQUEST_LOCATION);
}
catch (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.
...
Log.d("onResult", "UNAVAILABLE");
break;
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
// This log is never called
Log.d("onActivityResult()", Integer.toString(resultCode));
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (requestCode)
{
case REQUEST_LOCATION:
switch (resultCode)
{
case Activity.RESULT_OK:
{
// All required changes were successfully made
break;
}
case Activity.RESULT_CANCELED:
{
// The user was asked to change settings, but chose not to
break;
}
default:
{
break;
}
}
break;
}
}
Этот код работает хорошо, однако onActivityResult() всегда пропускается. Независимо от того, нажимает ли пользователь Yes, No или back из Dialog, onActivityResult() не запускается.
Мне нужно, чтобы Android вызывал onActivityResult(), поэтому, если пользователь не хочет включать службы определения местоположения, я могу обработать его соответствующим образом.
Страница разработчика Google (и вышеприведенный код) явно указывает, что следует вызывать onActivityResult(). Кто-нибудь знает, почему это пропущено?
Я также не знаю, в чем цель этой строки:
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
Спасибо!
Изменить: Основная информация о структуре моего приложения:
- Этот код содержится в методе
onResume()дляFragment, который реализуетGoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListenerиLocationListenerдля получения обновлений местоположения. Пример: здесь. - В
onLocationChanged()Fragmentбудет иметь пользовательский вызовViewinvalidate()и повторно рисовать себя с обновленной информацией.


