Как проверить, не сработали ли настройки местоположения при изменении

Я создаю объект locationrequest класса LocationRequest, методы которого используются для определения уровня точности определения местоположения, необходимого моему приложению.

private LocationRequest mLocationRequest;
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(2000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

а затем создать объект LocationSettingsRequest.Builder, а затем добавить к нему объект запроса местоположения.

new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);

Согласно документации Android, SettingsClient отвечает за правильную настройку системных параметров устройства в соответствии с потребностями приложения в местоположении.

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = 
client.checkLocationSettings(builder.build());

В документации указано, что после завершения задачи клиент может проверить настройки местоположения, просмотрев код состояния из объекта LocationSettingsResponse.

task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() 
{
            @Override
            public void onComplete(Task<LocationSettingsResponse> task) {
                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);

                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                } catch (ApiException exception) {
                    Log.v(" Failed ", String.valueOf(exception.getStatusCode()));

                    switch (exception.getStatusCode()) {

                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            // Cast to a resolvable exception.
                            ResolvableApiException resolvable = (ResolvableApiException) exception;
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            try {
                                resolvable.startResolutionForResult(
                                        MapsActivity.this,
                                        REQUEST_CHECK_SETTINGS);
                            } catch (IntentSender.SendIntentException e) {
                                e.printStackTrace();
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            break;
                    }
                }
            }
        });

Насколько я понимаю, приведенный выше код проверяет, смогла ли завершенная задача принять настройки местоположения, которые были изменены, когда мы это сделали.

В документации также указано, что если код состояния RESOLUTION_REQUIRED, клиент может вызвать startResolutionForResult(Activity, int), чтобы открыть диалоговое окно с запросом разрешения пользователя на изменение настроек местоположения для удовлетворения этих запросов.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode) {
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode) {
                case Activity.RESULT_OK:
                    // All required changes were successfully made
                    Toast.makeText(getBaseContext(), "All good", Toast.LENGTH_SHORT).show();
                    break;
                case Activity.RESULT_CANCELED:
                    // The user was asked to change settings, but chose not to
                    break;
                default:
                    break;
            }
            break;
    }
}

Я хочу, чтобы этот сценарий произошел, когда я могу проверить, был ли RESOLUTION_REQUIRED кодом состояния, и я могу предложить пользователю изменить его. Может ли кто-нибудь сказать мне, что я могу сделать в коде или в настройках телефона, чтобы проверить этот сценарий.


person Vinit Singh    schedule 24.02.2018    source источник


Ответы (2)


Винит Сингх,

Я не знаю, слишком ли поздно мой ответ, но у меня было это исключение, когда местоположение моего устройства отключено.

Я получаю это исключение:

com.google.android.gms.common.api.ResolvableApiException: 6: RESOLUTION_REQUIRED

Надеюсь, это поможет.

person Apolo    schedule 01.08.2018

Проблема в том, что в отличие от документации , мы не можем использовать поле status поля LocationSettingsResponse, переданного в поле OnSuccessListener, поскольку оно частное.

Когда задача завершится, ваше приложение сможет проверить настройки местоположения, просмотрев код состояния из объекта LocationSettingsResponse.

Я пришел к выводу, что OnSuccessListener вызывается только тогда, когда настройки действительно удовлетворяют запросу, а если нет, передается исключение в OnFailureListener (который может быть использован для решения проблемы, когда это ResolvableApiException).

person hardysim    schedule 11.01.2019