При получении текущего местоположения я использую SettingsClient, чтобы проверить, удовлетворены ли настройки местоположения на основе текущего LocationRequest.
В настоящее время моим приоритетом является HIGH_ACCURACY, для которого необходимо включить GPS любой ценой.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
settingsClient = LocationServices.getSettingsClient(this);
locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(500)
.setFastestInterval(500);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
locationSettingsRequest = builder.build();
Теперь, когда я вызываю SettingsClient.checkLocationSettings (), передавая его слушателям,
settingsClient.checkLocationSettings(locationSettingsRequest)
.addOnCompleteListener(this)
.addOnFailureListener(this);
он попадает в onFailure (), официальные образцы google на github в этом случае использует следующий подход;
Проверьте код состояния исключения, полученного в onFailure (), если это LocationSettingsStatusCodes.RESOLUTION_REQUIRED,
затем вызовите startResolutionForResult (), что позволяет нам включить GPS, ожидает результат с помощью onActivityResult.
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(LocationActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
showLocationError();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
showError();
break;
}
}
Проблема в том, что всякий раз, когда в настройках вызывается onFailure клиента и вызывается startResolution, он всегда попадает в случай Activity.RESULT_CANCELED. Но странная вещь здесь, хотя это говорит об отмене, GPS включается через несколько секунд.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// fetch location here
break;
case Activity.RESULT_CANCELED:
// this is called immediately first time
// and second time even when GPS is on
break;
}
break;
}
}
После того, как GPS включен, когда я выполняю ту же самую операцию (получение текущего местоположения), SettingsClient продолжает вызывать сбой, и результатом всегда является Activity.RESULT_CANCELED, несмотря на то, что GPS включен.
Выпуск воспроизводится на Redmi 4X и Motorola Droid Turbo
Кто-нибудь еще, кто использовал SettingsClient с таким подходом и сталкивался с подобными проблемами?
Вот официальный пример, за которым я следую
Эта ошибка также сообщается на официальной странице проблем GitHub