Я использую новую систему LocationSettingsRequest
для запроса местоположений с высокой точностью.Если на моем устройстве установлен режим энергосбережения, например, появится системное диалоговое окно с просьбой обновить точность определения местоположения.В большинстве случаев это работает, но в некоторых устройствах происходит следующее:
- Если устройство установлено в режим энергосбережения, системное диалоговое окно запрашивает разрешение gps и изменяет его на gps только в случае подтверждения.
- Если устройство настроено только на GPS, система запрашивает службы Wi-Fi и Google для улучшения местоположения и изменения местоположения в режиме энергосбережения в случае подтверждения.
Вот как я могу установить LocationSettingsRequest
:
val builder = LocationSettingsRequest.Builder()
.addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY))
.addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_HIGH_ACCURACY))
.setAlwaysShow(true)
settingsClient.checkLocationSettings(builder.build())
Это вызывает диалоговое окно системы Google Play Services для обновления настроек точности определения местоположения.Но, например, на Samsung Galaxy S6, работающем под управлением Android 7.0, местоположение никогда не обновляется с высокой точностью.
То же самое происходит, когда я пытаюсь использовать пример местоположения Google здесь .В папке locationupdates
выберите метод startLocationUpdates()
, в котором вызывается разрешение настроек:
private void startLocationUpdates() {
// Begin by checking if the device has the necessary location settings.
mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
//noinspection MissingPermission
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
updateUI();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
mRequestingLocationUpdates = false;
}
updateUI();
}
});
}
Запуск этого примера приложения на этом устройстве Samsung вызывает ту же проблему.onActivityResult()
вызывается для Activity.RESULT_CANCELED
дела.
Кто-нибудь сталкивался с чем-то подобным?Любые идеи о том, как решить проблему?