Статус разрешений Flutter NotAgain даже при первом запуске - PullRequest
0 голосов
/ 24 февраля 2019

Я использую плагин Разрешение , чтобы проверить состояние разрешений и запросить их, если они находятся в состоянии deny.Но каждый раз с первого раза статус разрешения для телефона и хранилища notAgain.Из-за этого я не могу запросить у пользователя разрешение на phone и storage.Я также указал их в своем файле манифеста Android.

Вот фрагмент кода для проверки и запроса разрешений

List<Permissions> permissions = await Permission.getPermissionStatus([PermissionName.Location, PermissionName.Phone, PermissionName.Storage]);
    permissions.forEach((permission) {
      if(permission.permissionStatus.toString().contains('deny') ){
        neededPermissions.add(permission.permissionName);
      }
    });
if(neededPermissions.length > 0){
      requestPermissions(neededPermissions);
    }

Я не понимаю, почему они notAgain с первого разазапуск приложения

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Возможно, ваше разрешение на запрос вызова дважды, Разрешение на запрос вызова внутри initState () для запроса запуска.

@override
void initState() {
super.initState();

requestPermission();

  }

requestPermission() async {
final res = await SimplePermissions.requestPermission(
    Permission.WriteExternalStorage);
print("permission request result is " + res.toString());

}

0 голосов
/ 05 мая 2019

У меня была та же проблема, когда getPermissionsStatus([PermissionName.Storage]) всегда возвращал PermissionStatus.notAgain до того, как на самом деле было отказано в каких-либо разрешениях.

Я обнаружил, что статус разрешения будет «Отклонять», только если кнопка «Отказано» быланажмите до того, как это произойдет, это всегда будет notAgain (возможно, есть обходной путь или мы неправильно поняли пакет - возможно, нам нужно использовать неопределенный статус).

Правильный поток для выбора разрешения в Androidвыглядит следующим образом:

1- Убедитесь, что функция имеет разрешение

a- если разрешение предоставлено - выполните функцию, связанную с функцией

b-, если разрешение не былоне предоставляется, а затем запросите его.

Запрос разрешения:

1 - Предоставьте пользователю некоторый контекст, объясняющий, почему требуется разрешение, это может быть в форме диалога или тоста илилюбой другой пользовательский интерфейс, объясняющий, почему приложение запрашивает это разрешение

2 - Если разрешение было разрешено, вы можете прыгать от радости и использоватьнужную функцию и продолжайте свою жизнь.

3- Если в разрешении было отказано (тогда оно становится сложным)

a- Если флаг «Больше не спрашивать» былне установлен, то вы должны снова и снова запускать образовательный диалог и запрос на разрешение.

b- Если установлен флаг «Больше не спрашивать», вы должны проинструктировать пользователя, что это за функция.для запроса все еще требуется это разрешение, и что теперь он должен перейти на страницу настроек и предоставить разрешение оттуда.Использование FlushBar с кнопкой, указывающей на страницу настроек, было бы подходящим способом сделать это.

Вот как мне удалось выполнить вышеизложенное с помощью пакета разрешений.

Пожалуйста, позвольте мнезнаю, если у вас есть лучший способ сделать это.

      bool deniedBefore = false; //store this value in SharedPreferences
//flag to check if the permission flow was denied before
        if(Platform.isAndroid)
        {
        if(deniedBefore)
        {
        Permission.getPermissionsStatus([PermissionName.Storage]).then((result){Permissions permission = result.removeAt(0);
        if(permission.permissionStatus==PermissionStatus.notAgain)
        {
        //showFlushbar();
        print("Direct users to Settings page")
        }

        if(permission.permissionStatus==PermissionStatus.deny)
        {
    print("Show educational dialog");
        //showEducationalDialog();
        }
        if(permission.permissionStatus==PermissionStatus.allow)
        {
        //use feature
        print("Permission was granted")
        }
        }
        }
        else
        {
        Permission.getPermissionsStatus([PermissionName.Storage]).then((result)
        {
        Permissions permission = result.removeAt(0);
        print(permission.permissionStatus);
        if(permission.permissionStatus!=PermissionStatus.allow)
        {
        //showDialog()
        setState(() { //the user has seen the permission request before - 
                      // if denied the status will be deny 
                     //if norAgain then it is a true notAgain is true
        deniedBefore = true;
        });
        }
        if(permission.permissionStatus==PermissionStatus.allow)
        {
        //useFeature
        }
        }
        }
        }

То, что я пытался достичь выше, - это позволить потоку разрешений запускаться хотя бы один раз, прежде чем проверять причину флага notAgain, только тогда я знаю, чтоэто правда не снова и не ошибка.

...