У меня была та же проблема, когда 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, только тогда я знаю, чтоэто правда не снова и не ошибка.