即使在授予存储权限后权限也被拒绝

Posted

技术标签:

【中文标题】即使在授予存储权限后权限也被拒绝【英文标题】:Permission Denied even after granting the Storage Permission 【发布时间】:2021-10-31 06:33:32 【问题描述】:

我已经添加了将文件下载到本地存储所需的所有内容,但仍然出现此错误

[错误:flutter/lib/ui/ui_dart_state.cc(209)] 未处理的异常: FileSystemException:创建失败,路径 = '/storage/emulated/0/uth_content'(操作系统错误:不允许操作, 错误号 = 1)

在清单中

<uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
       

  android:requestLegacyExternalStorage="true"
  android:hardwareAccelerated="true"

<application         
    android:requestLegacyExternalStorage="true" >

在 pubspec.yaml 中

permission_handler: ^6.1.1

我的飞镖文件

@override
  Future<int> downloadZipFile() async
     Directory extStorage = await _externalDataSource.GetExtStoragePath();
     if(extStorage !=null) 
         var response =  await _apiDataSource.downloadZipContent(extStorage.path);
         File zipfile = await response.zipFile;
         debugPrint("Downloaded file :" + zipfile.path + "Exist: " + zipfile.existsSync().toString());
         return response.statusCode;
       
     else
       debugPrint("Path is empty");
       createFolder("uth_content");
     

  

  Future<String> createFolder(String cow) async 
    final folderName = cow;
    final path = Directory("/storage/emulated/0/$folderName");
    var status = await Permission.storage.status;
    if (!status.isGranted) 
      await Permission.storage.request();
    
    if ((await path.exists())) 
      return path.path;
     else 
      path.create();
      return path.path;
    
  

如何确保创建文件夹,我的android api是30

【问题讨论】:

/storage/emulated/0 路径可能并不指向您认为的那样。您实际上打算在哪里创建“uth_content”文件夹? 嗨@Abion47 是的,就是文件夹 /storage/emulated/0 路径实际上并不存在。这是一个符号链接,可以指向不同手机上的不同事物,不一定指向外部存储中的某个位置。所以我再次问:你打算在哪里创建你的文件夹? 在内部存储上 我建议您通读this article 以找到您尝试将文件写入的位置以及您需要在那里写入的权限。话虽这么说,除非您有理由在其他任何地方进行写入,否则通常最好将文件位置限制在特定于应用程序的存储中。这样,您不需要任何权限就可以在那里写入,并且如果用户卸载您的应用程序,它可以被正确清理。 【参考方案1】:

您在AndroidManifest.xml 中缺少此权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

获取权限使用

if (await Permission.manageExternalStorage.request().isGranted) ...

注意:此权限被认为有很大风险,因此 Play 商店将拒绝您的应用,除非它是您应用的核心功能。

这就是谷歌所说的

核心功能被定义为应用的主要目的。没有 这个核心功能,应用程序“损坏”或呈现不可用。这 核心功能,以及构成此的任何核心功能 核心功能,必须在显着位置记录和推广 应用的描述。

如果您打算在外部目录中创建文件但找不到它,那是因为您必须告诉设备刷新文件。所以我建议使用这个package 并将你新创建的文件路径传递给它,或者如果你想用 kotlin 手动执行这里的代码

    private fun broadcastFileUpdate(path: String) 
        context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(File(path))))
        println("updated!")
    

【讨论】:

以上是关于即使在授予存储权限后权限也被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

存储访问框架 - 权限被拒绝问题,即使授予权限

Android kotlin:即使在授予权限后也获得 EACCES(权限被拒绝)

即使在 Ar.js 中的浏览器中授予权限后,地理定位访问被拒绝弹出窗口也会显示

即使用户授予位置权限检查,三星 note 20 也总是会被拒绝

Postgres:即使授予了授权,也拒绝架构的权限

即使具有管理员权限,批处理脚本访问也被拒绝