Я просматривал официальный документ о новой модели разрешений в Android M. В ней рассказывается о shouldShowRequestPermissionRationale()
функции, которая возвращается, true
если приложение запросило это разрешение ранее, а пользователь отклонил запрос. Если пользователь отклонил запрос на разрешение в прошлом и выбрал опцию «Больше не спрашивать», этот метод возвращается false
.
Но как мы можем различить следующие два случая?
Случай 1 : приложение не имеет разрешения, и у пользователя ранее не запрашивалось разрешение. В этом случае shouldShowRequestPermissionRationale () вернет false, потому что это первый раз, когда мы спрашиваем пользователя.
Случай 2 : пользователь отказал в разрешении и выбрал «Больше не спрашивать», в этом случае также shouldShowRequestPermissionRationale () вернет false.
Я хотел бы отправить пользователя на страницу настроек приложения в случае 2. Как мне провести различие между этими двумя случаями?
источник
shouldShowRequestPermissionRationale()
в этом случае возвращается false, что повредит любой код, использующий флаг «Я спрашивал раньше».permissions
на Android. github.com/android/permissions-samplesОтветы:
После M Preview 1, если диалоговое окно отображается впервые , флажок « Никогда не спрашивать снова» отсутствует .
Если пользователь отклоняет запрос на разрешение, во втором запросе разрешения будет установлен флажок Никогда не запрашивать снова .
Итак, логика должна быть такой:
Просить разрешение:
Проверьте, было ли разрешение отклонено или предоставлено в
onRequestPermissionsResult
.Если ранее было отказано в разрешении, на этот раз в диалоговом окне разрешений появится флажок Никогда не спрашивать .
Позвоните,
shouldShowRequestPermissionRationale
чтобы узнать, проверил ли пользователь Никогда больше не спрашивать .shouldShowRequestPermissionRationale
Метод возвращает false, только если пользователь выбрал Никогда не спрашивать снова или политика устройства запрещает приложению иметь такое разрешение:Таким образом, вам не придется отслеживать, если пользователь установил флажок Никогда не спрашивать или нет.
источник
context
вActivityCompat.shouldShowRequestPermissionRationale(...)
параметре фактически типаActivity
. Может не затронуть вас всех, но в моем случае это так.should
функцию обратного вызова и сохранять ее значение счетчика в NVM, чтобы узнать, нужно ли мне снова запрашивать запрос при следующем открытии приложения! ... вау (facepalm) ... было ли слишком сложно сделать только один вызов, возвращающий перечисление статуса ??У меня была такая же проблема, и я понял это. Чтобы упростить жизнь, я написал класс util для обработки разрешений во время выполнения.
И методы PreferenceUtil заключаются в следующем.
Теперь все, что вам нужно, это использовать метод checkPermission с правильными аргументами.
Вот пример,
Вы получите обратный вызов onPermissionAsk для случая 1 и onPermissionDisabled для случая 2.
Удачного кодирования :)
источник
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
,thisActivity
не что иное, какYourActivity.this
.context
вы используете?shouldShowRequestPermissionRationale(permission)
не существуетandroid.content.Context
. это в ActivityCompatОБНОВИТЬ
Я считаю, что ответ CanC ниже является правильным, которому следует следовать. Единственный способ узнать наверняка - это проверить это в обратном вызове onRequestPermissionResult с помощью shouldShowPermissionRationale.
==
Мой оригинальный ответ:
Единственный способ, который я нашел, - это самостоятельно отслеживать, является ли это в первый раз или нет (например, с помощью общих настроек). Если это не первый раз, используйте
shouldShowRequestPermissionRationale()
дифференциацию.Также см .: Android M - проверка прав доступа во время выполнения - как определить, если пользователь установил флажок «Никогда не спрашивать»?
источник
Насколько я понимаю, shouldShowRequestPermissionRationale () запускает несколько вариантов использования под капотом и уведомляет приложение о том, показывать или нет объяснение запрашиваемых разрешений.
Идея, лежащая в основе разрешений времени выполнения, заключается в том, что большую часть времени пользователь будет отвечать «да» на запрос разрешения. Таким образом, пользователь должен будет сделать только один клик. Конечно, запрос должен быть использован в правильном контексте - то есть запрос разрешения камеры при нажатии кнопки «Камера».
Если пользователь отклоняет запрос, но через какое-то время приходит и снова нажимает кнопку «Камера», shouldShowRequestPermissionRationale () вернет true, поэтому приложение может показать некоторые содержательные объяснения, почему запрашивается разрешение, и почему приложение не будет работать правильно без него. Обычно в этом диалоговом окне отображается кнопка, чтобы снова отказать / принять решение позже, и кнопка для предоставления разрешений. Кнопка предоставления разрешений в диалоговом окне обоснования должна снова запустить запрос на разрешение. На этот раз у пользователя также будет установлен флажок «Никогда больше не показывать». Если он решит выбрать его и снова отклонить разрешение, он уведомит систему Android о том, что пользователь и приложение не на одной странице. Это действие будет иметь два последствия - shouldShowRequestPermissionRationale () всегда будет возвращать false,
Но есть и другой возможный сценарий, в котором можно использовать onRequestPermissionsResult. Например, некоторые устройства могут иметь политику устройств, которая отключает камеру (работает для CIA, DARPA и т. Д.). На этих устройствах onRequestPermissionsResult всегда будет возвращать false, а метод requestPermissions () будет молча отклонять запрос.
Это то, что я собрал, слушая подкаст с Беном Поесом - менеджером по продукту на платформе Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
источник
Просто опубликуйте другой вариант, если кому-то захочется. Вы можете использовать EasyPermissions, предоставленную самим Google, чтобы, как сказано, «упростить системные разрешения Android M».
Тогда вам не придется обращаться
shouldShowRequestPermissionRationale
напрямую.источник
permissionPermanentlyDenied
внутренне только звонкиshouldShowPermissionsRationale
и возвращаетсяtrue
в том случае , если пользователь никогда не был предложен предоставить разрешение.Если кто-то заинтересован в решении Kotlin, я реорганизовал ответ @muthuraj, чтобы быть в Kotlin. Также немного модернизировано, чтобы иметь блок завершения вместо слушателей.
PermissionUtil
PermissionHandler
Реализация
источник
Проверьте эту реализацию. работает довольно хорошо для меня. в основном вы проверяете разрешения в методе checkPermissions (), передавая список разрешений. Вы проверяете результат запроса разрешения на onRequestPermissionsResult (). Реализация позволяет рассмотреть оба случая, когда пользователь выбирает «никогда больше не спрашивать» или нет. В этой реализации, если se выбирает «никогда больше не спрашивать», в диалоговом окне есть опция, позволяющая перейти к действию «Настройки приложения».
Весь этот код внутри моего фрагмента. Я думал, что было бы лучше создать специализированный класс для этого, например, PermissionManager, но я не уверен в этом.
источник
Может быть кому-то пригодится: -
Что я заметил, так это то, что если мы проверяем флаг shouldShowRequestPermissionRationale () в методе обратного вызова onRequestPermissionsResult (), он показывает только два состояния.
Состояние 1: -Возврат истины: - Каждый раз, когда пользователь нажимает кнопку «Запретить» (включая самый первый раз).
Состояние 2: - Возвращает false: - если пользователь выбирает «никогда не спрашивает».
Ссылка на подробный рабочий пример .
источник
Мы можем сделать это таким образом?
источник
shouldShowRequestPermissionRationale
для СПЕЦИАЛЬНОГО разрешения всегда возвращайте значение ИСТИНА ТОЛЬКО после того, как пользователь отклонил его без флажкаМы заинтересованы в ложном значении
Таким образом, есть 3 случая, потерянные с ложным значением:
1. Ранее такого действия не было, и теперь пользователь решает согласиться или отказаться.
Просто определите предпочтение,
ASKED_PERMISSION_*
которое не существует сейчас и было бы правдоподобно приonRequestPermissionsResult
его запуске в любом случае согласиться или отрицатьТак что, хотя это предпочтение не существует, нет причин для проверки
shouldShowRequestPermissionRationale
2. пользователь нажал согласиться.
Просто сделайте:
Который вернет истину и нет причин проверять
shouldShowRequestPermissionRationale
3. пользователь нажал кнопку «Отклонить с флажком» (второй или более раз)
Это ВРЕМЯ для работы с
shouldShowRequestPermissionRationale
которой будет возвращать FALSE(предпочтение существует, и у нас нет разрешения)
источник
Этот код запрашивает у пользователя запросить разрешение во время выполнения, если пользователь разрешает, он выполняет метод результата, если пользователь отказывает, он запрашивает снова с описанием пользователя deny (он запрашивает снова с инструкциями), но если пользователь выбирает, никогда не спрашивать снова. он обрабатывает никогда не спрашивать, отображать опцию открытых настроек с инструкциями.
источник