Как определить разрешение «Разрешить только при использовании приложения», когда пользователь дает разрешение на местоположение

#android #permissions #runtime-permissions

#Android #разрешения #время выполнения-разрешения

Вопрос:

Это основной вопрос, но я не нахожу решения для этого сценария. Я использовал библиотеку «Dexter» для запроса разрешений во время выполнения. Мне нужно получить разрешение на фоновое местоположение, чтобы я запрашивал разрешение, затем я увидел в Android Q, что есть опция «Разрешить только при использовании приложения», но при использовании dexter я не могу определить, когда пользователь выбирает эту опцию. Кто-нибудь может мне помочь, как решить это условие?

Комментарии:

1. «Кто-нибудь может мне помочь, как я решаю это условие?» — решать нечего. Пользователь может отозвать ваши разрешения в любое время по любой причине. Делает ли пользователь это вручную или с помощью опций, подобных этой (или более новых опций на Android 11), зависит от пользователя. И AFAIK нет способа определить, выбрал ли пользователь один из этих вариантов автоматического удаления.

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

3. «Тогда, если я хочу получать обновления местоположения пользователя даже после того, как пользователь закроет или уничтожит приложение, подобное приложению для «Райдеров», как я этого добьюсь?» — для этого есть отдельное ACCESS_BACKGROUND_LOCATION разрешение: developer.android.com/about/versions/10/privacy /. … Обратите внимание, что это немного изменилось в Android 11: developer.android.com/about/versions/11/privacy/location

Ответ №1:

Вы пробовали то, что объяснила команда Dexter? (Пример запроса разрешения ACCESS_BACKGROUND_LOCATION есть)

Приложение застряло при запросе ACCESS_BACKGROUND_LOCATION

И в официальном API Google они упомянули новое дополнение к фоновой проверке местоположения: ACCESS_BACKGROUND_LOCATION

Контрольный список доступа к фоновому местоположению

Этот API специально добавлен именно для этого: чтобы проверить, разрешает ли пользователь местоположение при использовании приложения (или означает, приложение на переднем плане, а не в фоновом режиме) или нет

Комментарии:

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

2. @Addy затем добавьте еще один запрос для ACCESS_BACKGROUND_LOCATION. Единственное замечание заключается в том, что в Android 11 вы должны запрашивать эти 2 разрешения отдельно (не комбинированные, а сначала на переднем плане, а затем на заднем плане), иначе вы потеряете доступ к обоим (переднему и фоновому).). CommonsWare предоставил ссылку на объяснение этого поведения

Ответ №2:

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

Если вы запрашиваете Manifest.permission.ACCESS_BACKGROUND_LOCATION и Manifest.permission.ACCESS_FINE_LOCATION в то же время, тогда Android вызовет вас onRequestPermissionsResult с различными установленными аргументами, зависит от ответа пользователя. В любом случае permissions аргумент будет тем же:

 ["android.permission.ACCESS_BACKGROUND_LOCATION", "android.permission.ACCESS_FINE_LOCATION."]
  

Затем, если пользователь разрешает «Только на этот раз» или «При использовании ..» вы получите в grantResults аргументе 0 (true) для ACCESS_FINE_LOCATION и -1 (false) для ACCESS_BACKGROUND_LOCATION:

 [-1, 0]
  

Но если пользователь разрешает «все время», вы получите:

 [0, 0]
  

Наконец, пользователь «отрицает»:

 [-1, -1]
  

Опять же, подсказка в том, что вы знаете, что разрешение «все время» подразумевает предоставление ACCESS_BACKGROUND_LOCATION.

 ActivityCompat.requestPermissions(this, [Manifest.permission.ACCESS_BACKGROUND_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION], 100)
...

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (grantResults[0] == PermissionChecker.PERMISSION_DENIED amp;amp; grantResults[1] == PermissionChecker.PERMISSION_DENIED) {
    // user denies
    }
    if (grantResults[0] == PermissionChecker.PERMISSION_DENIED amp;amp; grantResults[1] == PermissionChecker.PERMISSION_GRANTED) {
    // user allow while using
    }
    if (grantResults[0] == PermissionChecker.PERMISSION_GRANTED amp;amp; grantResults[1] == PermissionChecker.PERMISSION_GRANTED) {
    // user allow all the time
    }
}