Flutter Android 11 权限,例如 WhatsApp

Posted

技术标签:

【中文标题】Flutter Android 11 权限,例如 WhatsApp【英文标题】:Flutter Android 11 permissions like WhatsApp 【发布时间】:2021-11-08 13:06:42 【问题描述】:

我正在尝试构建一个在 android 11 上运行并下载文件的 Flutter 应用程序。我曾经管理外部存储权限来实现这一点,但是当应用程序请求权限时,它会直接进入设置,而不是在应用程序内请求允许或拒绝。

例如,WhatsApp 将数据存储在 android/media 文件夹中,但它直接在应用程序中请求权限,而不是进入设置页面。请参考以下图片:

My application goes to settings like this/I need something like this

我的权限处理代码

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;
    
  

【问题讨论】:

请分享您的代码 sn-p 以获得更好的帮助。此外,根据指南,只有在用户永久拒绝该权限时,设置屏幕才会打开。 分享您的代码或查看此pub.dev/packages/permission_handler 看起来您需要添加检查权限被拒绝,权限被永久拒绝。仅在拒绝永久打开设置页面上。否则请求许可 嘿,Narayana,您找到解决方案了吗? 【参考方案1】:

对于Android 11 及更高版本,这是管理 Android 设备中外部存储访问的两种不同方法。

Files Go 正在尝试访问 all files access permission。这使应用程序可以访问任何读取、写入、访问和共享用户存储(外部或内部)中存在的所有文件。 您可以从此处阅读有关所有文件访问权限的更多信息 - Manage all files on a storage device

WhatsApp - 不是要求all files access permission,而是将其媒体保存在文件目录中。保存在文件或缓存目录中不需要访问所有苍蝇,只需一个简单的权限对话框来写入和读取存储即可完成任务。

您可以在 getExternalFilesDir 了解更多信息。

注意:这仅适用于您的 targetSdkVersion 为 30 的情况。针对 29 或以下版本,不需要 all files permission,因为它由系统处理。

您可以在Storage updates in Android 11中参考存储更新并根据您的用例请求权限。

【讨论】:

您提供的链接没有提到如何像whatsapp一样在flutter中实现它 从代码中删除 Permission.manageExternalStorage 应该可以解决问题 如果您删除 Permission.manageExternalStorage,您将无法再读取此位置的隐藏文件夹 /storage/emulated/0/Android/Media/com.whatsapp/WhatsApp/Media/.Statuses 对此有何解决方案? @AnkitParmar ,如果是您的应用程序包名称/存储,则可以读取,如果不是您的应用程序,则无法访问。 @Nitish Ya 我知道但是如何阅读其他应用程序的隐藏文件夹?没有 Permission.manageExternalStorage 权限?【参考方案2】:

即使您使用的是 Android 11 或更高版本,我们也必须询问存储权限,而不是 Flutter 中的管理外部存储权限。我尝试将文件写入'android/media/packagename/'并且它工作正常,但是当我尝试写入其他位置时它不起作用。我认为不知何故,Android 内部只允许将数据存储在同一个包中。

【讨论】:

以上是关于Flutter Android 11 权限,例如 WhatsApp的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Android权限问题

Flutter 插件开发:导入库

为啥我的 Flutter 应用在​​ Android 上请求 Run on Startup 权限?

android清单文件中的颤振位置权限问题

Flutter 设备管理员权限

如何从flutter访问设备应用