Странное поведение приоритетов LocationRequest - PullRequest
0 голосов
/ 20 ноября 2018

Итак, у меня есть приложение.Это зависит от местоположения пользователя.На многих устройствах все работало нормально, как я и ожидал.Есть проблема с samsung s8, я проверил 4 реальных s8 от разных пользователей и с другим приложением, которому нужно местоположение, и проблема там.Но теперь мой xiaomi mi a1 (с чистым android) получает обновление безопасности для Android (8.1 ноября), и я получаю ту же проблему, что и на s8.

Проблема: я отключаю службу определения местоположения в настройках устройства.Я запускаю свое приложение или другое приложение, которому нужно местоположение (не карты Google, оно работает потрясающе).Я получаю системный диалог по умолчанию для включения служб определения местоположения.Я нажимаю ОК, и один раз он запускает службу определения местоположения со всеми источниками, а в другой раз он запускает только GPS.«Только GPS» работает очень плохо, я жду одну - две минуты, и это не дает моей позиции и не устанавливает синюю точку на карте.Я выключаю местоположение и закрываю приложение, открываю и снова открываю это диалоговое окно, и после «ОК» оно запускает все источники, и я мгновенно получаю местоположение.

Как я понимаю, режим, который будет установлен при запуске службы определения местоположениязависит от приоритета LocationRequest.Так почему же когда-то он установил режим «все источники» и один раз «только gps», это примерно LocationRequest.PRIORITY_HIGH_ACCURACY.Если я попытаюсь использовать LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY (это мое значение по умолчанию для s8) на всех устройствах, которые я проверял, он запустит режим «wifi и другие сети», но все время будет в том же режиме.

Я использую FusedLocationClient.Мой код для запуска системного диалогового окна:

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(getLocationRequest());
        builder.setAlwaysShow(true);
        SettingsClient client = LocationServices.getSettingsClient(this);
        Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                if (e instanceof ResolvableApiException) {
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        ResolvableApiException resolvable = (ResolvableApiException) e;
                        resolvable.startResolutionForResult(MapsActivity.this,
                                REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException sendEx) {
                        // Ignore the error.
                        if (sendEx.getMessage() != null) {
                            Crashlytics.logException(new RuntimeException("startGpsService: " + sendEx.getMessage()));
                        }
                    }
                }
            }
        });

И мой LocationRequest:

if (mLocationRequest == null) {
            mLocationRequest = new LocationRequest();
            if (Build.MANUFACTURER.toLowerCase().contains("samsung") &&
                    Build.MODEL.toLowerCase().contains("sm-g95")) {
                mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
            } else {
                mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            }
            mLocationRequest.setInterval(2000);
            mLocationRequest.setFastestInterval(1000);
        }
        return mLocationRequest;

Я буду рад получить любые предложения.


Обновление,Я провожу некоторые тесты, это журнал:

2018-11-20 09:56:11.055 29850-29850 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 09:56:29.554 30111-30111 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: location providers not enabled
2018-11-20 09:56:48.847 30309-30309 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 09:57:30.645 30647-30647 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: location providers not enabled
2018-11-20 09:57:58.354 30908-30908 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 09:58:16.632 31159-31159 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: location providers not enabled
2018-11-20 09:59:57.753 1665-1665 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 10:00:14.176 2200-2200 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 10:00:30.406 2963-2963 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: NETWORK_PROVIDER && GPS_PROVIDER both enabled
2018-11-20 10:00:45.215 3398-3398 D/TAG_MAP_PROVIDER_CHECK: onActivityResult: location providers not enabled

Все время, когда я получаю сообщение «провайдеры местоположения не включены», оно приходит к onActivityResult с (requestCode == REQUEST_CHECK_SETTINGS && resultCode == RESULT_CANCELED) и включается режим «Только устройство».

Похоже, это зависит от того, где именно был мой палец на кнопке «Да».Дополнительный вопрос: могу ли я сделать пользовательский вид для диалогового окна «включить местоположение» системы?

...