#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
}
}