Трепещите разрешениями Android 11, такими как WhatsApp

#android #flutter #android-permissions #whatsapp #android-11

Вопрос:

Я пытаюсь создать приложение Flutter, которое работает на Android 11 и загружает файлы. Я использовал для этого разрешение на управление внешним хранилищем, но когда приложение запрашивает разрешение, оно переходит непосредственно в настройки, а не запрашивает разрешение или запрет в приложении.

Например, WhatsApp хранит данные в папке android/media, но запрашивает разрешение непосредственно в приложении, а не на странице настроек. Пожалуйста, обратитесь к приведенным ниже изображениям:

Мое приложение переходит к настройкам, подобным этому / Мне нужно что-то вроде этого

Мой код обработки разрешений

 Future<bool> requestPermission() async {
  var androidInfo = await DeviceInfoPlugin().androidInfo;
  var release = int.parse(androidInfo.version.release);
  Permission permission;
  if (release < 11) {
    permission = Permission.storage;
  } else {
    permission = Permission.manageExternalStorage;
  }
  if (await permission.isGranted) {
    return true;
  } else {
    var result = await permission.request();
    if (result == PermissionStatus.granted) {
      return true;
    } else {
      return false;
    }
  }
}
 

Комментарии:

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

2. Поделитесь своим кодом или проверьте этот pub.dev/пакеты/permission_handler

3. Похоже, вам нужно добавить проверки на наличие запрещенного разрешения, постоянно запрещенного разрешения. только на запрещенной постоянно открытой странице настроек. В противном случае запросите разрешение

4. эй, Нараяна, ты нашел решение этой проблемы ?

Ответ №1:

Это два разных подхода к управлению доступом к внешнему хранилищу на устройстве Android для Android 11 и выше.

Файлы Go пытается получить доступ к all files access permission . Это дает приложению доступ к любому чтению, записи, доступу и обмену всеми файлами, находящимися в пользовательском хранилище(внешнем или внутреннем). Вы можете прочитать больше о разрешении на доступ ко всем файлам здесь — Управление всеми файлами на устройстве хранения

WhatsApp — вместо того , чтобы запрашивать all files access permission , сохраняет свои носители в каталоге файлов. Для сохранения в каталоге файлов или кэша не требуется доступ ко всем файлам, и простое диалоговое окно разрешений для записи и чтения в хранилище выполняет эту задачу.

Вы можете прочитать больше об этом в getExternalFilesDir.

Примечание: Это применимо только в том случае, если ваша версия targetSdk равна 30. Ориентируясь на версию 29 или ниже, в этом нет необходимости all files permission , поскольку она обрабатывается системой.

Вы можете обратиться к обновлениям хранилища и запросить разрешение в соответствии с вашим вариантом использования в обновлениях хранилища в Android 11.

Комментарии:

1. В ссылках, которые вы предоставили, не упоминалось, как это реализовать в flutter, например в whatsapp

2. Удаление Permission.manageExternalStorage из кода должно помочь

3. если вы удалите Permission.manageExternalStorage, вы больше не сможете читать скрытую папку для этого местоположения /хранилища/эмулируемого/0/Android/Медиа/com.whatsapp/WhatsApp/Медиа/.Статусы Какое-либо решение этой проблемы ?

4. @Ankitparm , если это имя пакета/хранилища вашего приложения , вы можете прочитать его, если это не ваше приложение, вы не можете получить к нему доступ.

5. @Nitish Я знаю, но как прочитать скрытую папку других приложений ? без разрешения.Разрешение manageExternalStorage ?

Ответ №2:

Даже если вы используете Android 11 или выше, мы должны запросить разрешение на хранение, а не разрешение на управление внешним хранилищем в Flutter. Я попытался записать файлы в » android/media/имя пакета/», и он работает нормально, но когда я пытаюсь записать в другие места, он не работает. Я думаю, что каким-то образом Android внутренне позволяет хранить данные только в одном пакете.