Обнаружение разрешения может быть запрошено или постоянно отклонено - PullRequest
0 голосов
/ 01 июня 2018

Ситуация
Один из моих фрагментов получает доступ к камере.Поэтому, конечно, мне нужно сначала проверить разрешение в своей деятельности, прежде чем я перенаправлю на него.Если пользователь отказывает в разрешении, которое действие завершает, и перенаправляет его на предыдущее действие, в котором он находился.
Кроме того, я хотел бы показать другой фрагмент при запуске действия и обнаруживает, что в разрешении было постоянно отказано.(Небольшой флажок «Никогда больше не спрашивать» в диалоговом окне разрешений Android)

Проблема
Я не смог найти правильный способ обнаружения, было ли разрешение отклонено только один раз или еслифлажок «Никогда больше не спрашивать» был установлен в последний раз и навсегда отказал в разрешении.
Имейте в виду, что я не хочу знать об этом в обратном вызове onRequestPermissionsResult.Мне нужно знать в onCreate моей Деятельности, если разрешение в настоящее время предоставлено, отказано или постоянно отклонено.

То, что я пытался
ActivityCompat#shouldShowRequestPermissionRationale, кажется, обнаруживает, имеет ли разрешение разрешениебыло отказано в прошлом или нет.Он также возвращает истину, если ему было отказано только один раз, а не навсегда.

PermissionChecker#checkPermission(), похоже, не заметил никакой разницы между постоянно и только один раз состоянием отказа в доступе.

Вопрос
Существует ли какой-либо способ обнаружения, разрешено ли разрешение, но все еще можно запросить или если оно постоянно отклонено?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете проверить разрешение,

if (permissionStatus.getBoolean(Manifest.permission.CALL_PHONE, false)){}

Обычно я проверяю разрешение, используя следующее,

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

   if (ActivityCompat.shouldShowRequestPermissionRationale(TrackActivity.this, Manifest.permission.CALL_PHONE)) {
                ActivityCompat.requestPermissions(TrackActivity.this, new String[]{Manifest.permission.CALL_PHONE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
       } else if (permissionStatus.getBoolean(Manifest.permission.CALL_PHONE, false)) {

       } else {
                ActivityCompat.requestPermissions(TrackActivity.this, new String[]{Manifest.permission.CALL_PHONE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
       }
            SharedPreferences.Editor editor = permissionStatus.edit();
            editor.putBoolean(Manifest.permission.CALL_PHONE, true);
            editor.apply();
   }
0 голосов
/ 01 июня 2018

Есть ли способ определить, отказано ли в разрешении, но все еще может быть запрошено, или если оно навсегда отказано?

К сожалению, нет официального API для обнаружения, если разрешениенавсегда отказано, когда пользователь выбирает « Никогда не спрашивать снова »

Существует один обходной путь, который использует shouldShowRequestPermissionRationale.Создайте SharedPreference со значением по умолчанию false и сохраните в нем значение, возвращаемое shouldShowRequestPermissionRationale.Перед обновлением значения проверьте, установлено ли значение true.Если это было true, не обновляйте его.

Всякий раз, когда вы хотите проверить разрешение, получите значение из SharedPreference и текущее значение, возвращенное shouldShowRequestPermissionRationale.Если shouldShowRequestPermissionRationale возвращает false, но значение из SharedPreference равно true, вы можете сделать вывод, что Never ask again был выбран пользователем.

Вы можете обратиться к моему блогу , гдеЯ описал этот подход.

...