Отказ от подсказки Google при попытке определить местоположение

Я разрабатываю простое приложение, используя плагин Flutter location, с некоторым кодом, основанным на своем примере кода. :

var location = new Location();
try {
  _currentLocation = await location.getLocation();
} on PlatformException catch (e) {
  if (e.code == 'PERMISSION_DENIED') {
    _locationMsg = 'Permission denied';
  }
  _currentLocation = null;
}

Как указано на странице плагина, я добавил ACCESS_FINE_LOCATION в манифест Android.

Проблема в том, что когда я тестирую приложение на телефоне (с Android 9, если это актуально), даже если определение местоположения включено и у меня есть сигнал GPS, выполнение приведенного выше кода приводит к следующему быстрый:

Подсказать о включении службы определения местоположения Google

Подсказка гласит: "Для удобства работы включите определение местоположения устройства, которое использует службу определения местоположения Google". с двумя кнопками: "НЕТ, СПАСИБО" и " ОК".

Это ужасно неудобно для пользователя: местоположение уже поступает из GPS, нет необходимости дополнительно беспокоить пользователя.

Откуда возникает проблема и как я могу избежать этого запроса? Я предпочитаю сообщать о «неизвестном местоположении», чем отображать подсказку.

Изменить: обратите внимание, что приглашение не связано с уведомлением пользователя о том, что местоположение будет использоваться, а является функцией Google, нарушающей конфиденциальность, которая при нажатии кнопки "ОК" включает точность определения местоположения Google, как описано ниже (скрыто глубоко в меню настроек):

Описание точности определения местоположения Google

На приведенном выше изображении указано: "Повысить точность определения местоположения" с кнопкой-переключателем. Точность определения местоположения Google. Служба определения местоположения Google повышает точность определения местоположения за счет использования сетей Wi‑Fi и мобильных сетей, помогающих определить ваше местоположение. Анонимные данные о местоположении будут отправляться в Google, когда ваше устройство включено.

Нажатие на первое приглашение включает это, что пользователь должен отключить вручную, если он не хочет отправлять данные о своем местоположении в Google. Отключение его и повторная попытка получить местоположение приводит к тому же запросу, поэтому он определенно не связан с предупреждением пользователя об использовании данных о местоположении. Кроме того, если Google Location Accuracy включен перед использованием приложения, подсказка никогда не появляется, вероятно, поэтому большинство разработчиков никогда ее не замечают.

Я знаю, что можно получить данные о местоположении без включения Google Location Accuracy, поскольку большинство приложений делают это. Но я не знаю, откуда приходит подсказка: это плагин местоположения Flutter? Тот факт, что я использую Android 9 SDK? Или пример кода?


person anol    schedule 08.06.2019    source источник
comment
Я думаю, что это сделано для того, чтобы уведомить пользователя о том, что его местоположение будет использоваться, и дать ему выбор. На самом деле это не так ужасно недружественно к пользователю, если оно предполагает предоставление пользователю права выбора и отображается только один раз. Показать неизвестное местоположение, если они отклоняются.   -  person Aaron    schedule 09.06.2019
comment
@Aaron Нет, подсказка не предназначена для уведомления пользователя о том, что приложение использует местоположение. Я отредактировал вопрос, чтобы уточнить его: подсказка касается только точности определения местоположения Google, что является ненужной функцией, нарушающей конфиденциальность. Почти все приложения, которые у меня есть, не требуют этого, поэтому это должен быть либо плагин местоположения Flutter, либо Android 9 SDK, который я настроил.   -  person anol    schedule 09.06.2019
comment
О, я вижу, я извиняюсь   -  person Aaron    schedule 09.06.2019
comment
Не нужно извиняться, ваш комментарий — хорошая иллюстрация того, почему Google использует такие темные шаблоны. Ужасно, что писать недисфункциональное приложение (то есть, уважающее конфиденциальность) становится все труднее и труднее.   -  person anol    schedule 09.06.2019
comment
Этот тоже сводит меня с ума. Я столкнулся с этим только на эмуляторе. Я действительно ненавижу это. После того, как я нажму «ОК», в моем приложении ничего не происходит. Мне нужно знать, что пользователь принял это.   -  person Neon Warge    schedule 04.11.2019
comment
Как переопределить язык в этом диалоговом окне, не используя его из системных настроек?   -  person I.Step    schedule 07.08.2021


Ответы (2)


Кажется, проблема связана с плагином location. Я попытался заменить его на geolocator и изменить код вызывающего абонента, и на этот раз такой подсказки не появляется.

Я попытался понизить точность, прежде чем запрашивать местоположение, но плагин location по-прежнему отображает подсказку. Должен быть какой-то базовый код, который аппаратно запрограммирован для запроса точности местоположения Google во всех случаях.

Если бы только Google предоставил способ навсегда отключить подсказку с систематическим «нет» (это было проблемой для нескольких выпусков Android), я мог бы дать им презумпцию сомнения.

person anol    schedule 09.06.2019
comment
У меня такая же проблема, как ни странно, только в эмуляторе Android, но не при тестировании на физическом устройстве. Есть ли какое-либо известное обходное решение для Location (), вместо того, чтобы заменить его геолокатором? - person puntofisso; 25.10.2019

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

Вот мой код на Котлине, и оскорбительное выражение написано под примечанием заглавными буквами:

private fun checkLocationPermission() : Boolean = (ContextCompat.checkSelfPermission(
        requireContext(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)

private fun startLocationRequests() {
    val locationRequest = LocationRequest.create()?.apply {
        interval = 10000
        fastestInterval = 5000
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    }

    val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest!!)
    val client: SettingsClient = LocationServices.getSettingsClient(requireActivity())
    val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

    task.addOnSuccessListener { locationSettingsResponse ->
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...

        if (checkLocationPermission()) {
            locationPermissionGranted = true
            fusedLocationProviderClient.requestLocationUpdates(
                    locationRequest, locationCallback, Looper.getMainLooper())
        }
    }

    task.addOnFailureListener { exception ->
        if (exception is ResolvableApiException){
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                // IF STATEMENT THAT PREVENTS THE DIALOG FROM PROMPTING.
                    if (checkLocationPermission()) { 
                        exception.startResolutionForResult(
                            requireActivity(),
                            REQUEST_CHECK_SETTINGS
                        )
                    }
            } catch (sendEx: IntentSender.SendIntentException) {
                // Ignore the error.
            }
        }
        Timber.i("Location Listener failed")
    }
}

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

Кроме того, я не уверен в использовании плагина Flutter для определения местоположения, но в вашем случае и других я бы рекомендовал следовать документации разработчика, когда дело доходит до запроса местоположения пользователя. Возможно, это применимо и к Flutter: https://developer.android.com/training/location/change-location-settings

person Adam B.    schedule 18.02.2021