Мое приложение требует, чтобы пользователи находились в определенном месте, прежде чем они смогут использовать некоторые функции. Чтобы проверить это, я использую API Google Location Services как часть Google Play Services (com.google.android.gms: play-services-location: 16.0.0).
Это работало годами без проблем, но в связи с недавней плохой публикацией Google в отношении конфиденциальности данных пользователи просят, чтобы приложение НЕ требовало "Точность определения местоположения Google" (также известное как wifi-сканирование). Проблема в том, что я не думаю, что Play Services позволит мне проверить настройки без него.
Пример кода:
LocationRequest mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setInterval(UPDATE_INTERVAL).setFastestInterval(FASTEST_INTERVAL_SUCCESS);
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
checkLastLocation(this);
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
mHelper.handleError(e.getMessage());
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
mHelper.onLocationReady();
break;
}
}
});
Когда этот код запускается, задача всегда будет сообщать об ошибке, если точность определения местоположения Google отключена - даже если устройство GPS включено, и независимо от того, какой уровень точности (приоритет) я установил в запросе местоположения. «StartResolutionForResult» вызовет запрос на его включение.
Если пользователь ОТКАЗЫВАЕТ эту подсказку, я могу получить дополнительную информацию, используя:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
LocationSettingsStates lss = LocationSettingsStates.fromIntent(data);
if (lss.isLocationPresent() && lss.isLocationUsable()) {
checkLastLocation(this);
}
}
Это говорит мне о том, что, хотя они отклонили запрос, мой запрос на обновление местоположения будет выполнен успешно, но вместо этого он будет обслуживаться другими поставщиками.
В идеале, я бы хотел, чтобы задача не провалилась, но если это необходимо, то я бы хотел получить LocationSettingsStates без , не нуждающихся в ошибках пользователя с помощью startResolutionForResult ().
API предполагает, что я должен иметь возможность вызывать task.getResult (). GetLocationSettingsStates ()), но это работает только тогда, когда задача успешно выполнена (когда мне не нужна информация) - в противном случае вызов task.getResult () создает исключение ApiException (то же, которое было отправлено в onFailure).