Я создаю объект locationrequest класса LocationRequest, методы которого используются для определения уровня точности определения местоположения, необходимого моему приложению.
private LocationRequest mLocationRequest;
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(2000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
а затем создать объект LocationSettingsRequest.Builder, а затем добавить к нему объект запроса местоположения.
new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
Согласно документации Android, SettingsClient отвечает за правильную настройку системных параметров устройства в соответствии с потребностями приложения в местоположении.
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task =
client.checkLocationSettings(builder.build());
В документации указано, что после завершения задачи клиент может проверить настройки местоположения, просмотрев код состояния из объекта LocationSettingsResponse.
task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>()
{
@Override
public void onComplete(Task<LocationSettingsResponse> task) {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
} catch (ApiException exception) {
Log.v(" Failed ", String.valueOf(exception.getStatusCode()));
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
try {
resolvable.startResolutionForResult(
MapsActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
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;
}
}
}
});
Насколько я понимаю, приведенный выше код проверяет, смогла ли завершенная задача принять настройки местоположения, которые были изменены, когда мы это сделали.
В документации также указано, что если код состояния RESOLUTION_REQUIRED, клиент может вызвать startResolutionForResult(Activity, int), чтобы открыть диалоговое окно с запросом разрешения пользователя на изменение настроек местоположения для удовлетворения этих запросов.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (requestCode) {
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Toast.makeText(getBaseContext(), "All good", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
break;
default:
break;
}
break;
}
}
Я хочу, чтобы этот сценарий произошел, когда я могу проверить, был ли RESOLUTION_REQUIRED кодом состояния, и я могу предложить пользователю изменить его. Может ли кто-нибудь сказать мне, что я могу сделать в коде или в настройках телефона, чтобы проверить этот сценарий.