Запрос местоположения высокой точности с LocationSettingsRequest без обновления настроек местоположения - PullRequest
4 голосов
/ 04 апреля 2019

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

  1. Если устройство установлено в режим энергосбережения, системное диалоговое окно запрашивает разрешение gps и изменяет его на gps только в случае подтверждения.
  2. Если устройство настроено только на 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 дела.

Кто-нибудь сталкивался с чем-то подобным?Любые идеи о том, как решить проблему?

1 Ответ

1 голос
/ 15 апреля 2019

Имея ту же проблему в устройствах Android 8.0 и 8.1. Я решил проблему, изменив режим местоположения на Экономия батареи.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

Заменен запрос HIGH_ACCURACY.

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