即使在授予存储权限后权限也被拒绝
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 中的浏览器中授予权限后,地理定位访问被拒绝弹出窗口也会显示