Получение местоположения устройства из Google Play Services без необходимости включения сканирования Wi-Fi - PullRequest
1 голос
/ 15 мая 2019

Мое приложение требует, чтобы пользователи находились в определенном месте, прежде чем они смогут использовать некоторые функции. Чтобы проверить это, я использую 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).

...