Запрос SettingsClient на местоположение всегда получает RESULT_CANCELED - PullRequest
5 голосов
/ 06 апреля 2019

При получении текущего местоположения я использую 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

1 Ответ

0 голосов
/ 03 июня 2019

Добавить эту строку bulider.setAlwaysShow (истина);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...