Разрешить все время подсказки местоположения не поступать в Android SDK 29

Я не могу получить запрос Разрешить все время для местоположения в SDK 29. Я уже установил эти разрешения в манифесте:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

и запрашивая у пользователя разрешение на использование этих разрешений во время выполнения. Но он возвращает только варианты Когда приложение открыто и Отклонить.

Есть мысли о том, как показать это в SDK 29.


person Shailendra Madda    schedule 20.05.2020    source источник


Ответы (8)


Чтобы получить доступ к местоположению в фоновом режиме на устройстве под управлением Android 10 (уровень API 29) или выше, вам также необходимо использовать разрешение ниже в файле манифеста.

 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

пожалуйста, обратитесь к приведенной ниже ссылке для получения дополнительной информации

https://developer.android.com/training/location/permissions?hl=fr

person satuser    schedule 20.05.2020
comment
Я добавил этот запрос на разрешение в манифесте, и я до сих пор не получаю параметр «Разрешить все время», просто «Разрешить только при использовании параметра приложения». У меня есть другое приложение с тем же набором разрешений, и это получает и то, и другое! Нужно ли мне также запрашивать у пользователя фоновое местоположение? - person Brian Reinhold; 28.06.2020
comment
Да, @BrianReinhold. Просто добавьте Manifest.permission.ACCESS_BACKGROUND_LOCATION в свой массив разрешений при вызове ActivityCompat.requestPermissions () - person Zinc; 27.07.2020
comment
@BrianReinhold Да, вам нужно спросить это разрешение - person Shailendra Madda; 28.08.2020
comment
Добавил строку в манифест, И я запрашиваю разрешение. Ничего такого! - person lawonga; 07.09.2020

Добавьте ACCESS_BACKGROUND_LOCATION в манифест и массив разрешений. Если вы добавляете разрешение только в манифесте, то параметры «Разрешить все время» отображаться не будут. Вам нужно добавить в массив, чтобы пользователи просили предоставить во время выполнения.

В манифесте:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

В вашей деятельности:

if (ContextCompat.checkSelfPermission( this.applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION), MY_PERMISSIONS_REQUEST_LOCATION)
} else {
  // permission granted            
}
person Dhrumil Shah    schedule 23.09.2020
comment
Этот ответ следует считать принятым. В нем подробно описано, как показать параметр расположения фона в диалоговом окне разрешений. - person jpvillegas; 06.11.2020

Добавьте разрешение ACCESS_BACKGROUND_LOCATION в манифест. Требуется всегда показывать опцию разрешить на Android 10 и выше.

См. Второй пункт в https://developer.android.com/training/location/background#evaluate

person Antonio    schedule 20.05.2020

Я обнаружил, что добавления только разрешения в манифесте недостаточно. Мне пришлось предоставить пользователю возможность предоставить его при запуске, как мне нужно сделать для ACCESS_FINE_LOCATION. Интересно, что когда я проверяю, предоставлено ли уже фоновое разрешение в приложении, оно никогда не дает false. Но если я не проверю, у меня не будет опции «Разрешить все время». Это на Android Pixel 2 версии 10.

Это необходимо только в 10+ версиях Android. Запрос обоих разрешений дает пользователю возможность выбора в диалоговом окне ... конечно, пользователь не может выбрать «Все время». С этим ничего не поделаешь!

person Brian Reinhold    schedule 28.06.2020
comment
Да, что мы должны сделать, чтобы предоставить пользователю возможность. без этого как можно спросить разрешения на выполнение? - person Shailendra Madda; 29.06.2020

Чтобы получить доступ к местоположению в фоновом режиме на устройстве с Android API уровня 29 или выше, вам также необходимо добавить разрешение ниже в файл манифеста.

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

Вы можете сохранить все три из них или удалить либо ACCESS_FINE_LOCATION, либо ACCESS_COARSE_LOCATION, но один из них обязательно должен присутствовать в файле манифеста.

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

if (requireContext().checkSelfPermission(PERMISSION_NAME_1) != PackageManager.PERMISSION_DENIED && requireContext().checkSelfPermission(PERMISSION_NAME_2) != PackageManager.PERMISSION_DENIED ...) {
    requestPermissions(@NonNull String[] permissions, int requestCode)
person Ashish khare    schedule 08.09.2020
comment
Примечание. Это жестко ограниченное разрешение, которое не может удерживаться приложением, пока установленный установщик не внесет это разрешение в белый список. Дополнительные сведения см. В разделе PackageInstaller.SessionParams.setWhitelistedRestrictedPermissions (Set). - person Afzal N; 15.09.2020

Как сказал @Brian Reinhold в своем ответе, помещения ACCESS_BACKGROUND_LOCATION в манифест недостаточно, чтобы сделать Разрешить все время. параметр отображается во всплывающем окне разрешений. Вам нужно явно потребовать ACCESS_BACKGROUND_LOCATION разрешение в вашем коде, например:

С помощью библиотеки EasyPermissions:

if (!EasyPermissions.hasPermissions(requireContext(), *perms)) {
  val builder = PermissionRequest
                .Builder(this, REQUEST_LOCATION_PERMISSION, *perms)
                .setRationale(getString(R.string.location_disclaimer))
                
                EasyPermissions.requestPermissions(builder.build())
}

companion object {
   var perms = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                arrayOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_BACKGROUND_LOCATION)
   } else {
       arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
   }
}
person Nicola Gallazzi    schedule 28.08.2020

как сказал другой ответ, вы должны использовать

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

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

const accessFineLocationPermission = await this.permissions.checkPermission(this.permissions.PERMISSION.ACCESS_FINE_LOCATION)
if (accessFineLocationPermission && !accessFineLocationPermission.hasPermission) {
  await this.permissions.requestPermission(this.permissions.PERMISSION.ACCESS_FINE_LOCATION)
}

с помощью подключаемого модуля Cordova для разрешений Android: https://ionicframework.com/docs/native/android-permissions

Вы должны запросить ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION и ACCESS_BACKGROUND_LOCATION.

person Cristian Zumelzu    schedule 13.10.2020

Для доступа к местоположению требуются два типа разрешений Android:

  1. Разрешение переднего плана (разрешено только при использовании приложения) для местоположения переднего плана
  2. Фоновое разрешение (разрешено постоянно) для фонового местоположения

Если ваше приложение запрашивает разрешение в фоновом режиме, запросы должны быть следующими:

  • Сначала сделайте запрос на доступ к местоположению переднего плана.
  • А затем вы можете запросить доступ к фоновому местоположению.

Примечание. Рекомендуется отключить доступ пользователей для фонового местоположения, пока ваше приложение не получит доступ к местоположению на переднем плане.

Итак, как получить доступ к фоновому разрешению:

Шаг 1. Объявите эти разрешения в манифесте.

<manifest>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Шаг 2. Проверьте разрешение на выполнение.

   if (ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        // Request for Foreground permission
        ActivityCompat.requestPermissions(
            this@YourActivity,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            FINE_LOCATION_REQUEST_CODE
        )
    } else {

        // Request for Background permission
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ActivityCompat.requestPermissions(
                this@MainActivity,
                arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                BACKGROUND_REQUEST_CODE
            )
        }
    }
person Subarata Talukder    schedule 03.04.2021