android - Flutter:在外部存储路径上创建目录 - 路径提供程序 getExternalStorageDirectory()
问题描述
我正在创建一个颤振应用程序,我想在其中下载图像并将其存储到外部存储(不是文档目录),以便任何照片库应用程序都可以查看它。我正在使用以下代码创建目录
var dir = await getExternalStorageDirectory();
if(!Directory("${dir.path}/myapp").existsSync()){
Directory("${dir.path}/myapp").createSync(recursive: true);
}
它给了我以下错误:
FileSystemException: Creation failed, path = '/storage/emulated/0/myapp' (OS Error: Permission denied, errno = 13)
我已经在清单文件中设置了权限,并使用以下代码获取运行时权限
List<Permissions> permissions = await Permission.getPermissionStatus([PermissionName.Storage]);
permissions.forEach((p) async {
if(p.permissionStatus != PermissionStatus.allow){
final res = await Permission.requestSinglePermission(PermissionName.Storage);
print(res);
}
});
我已经在设置中验证了该应用程序已获得许可,也正如这里的一些答案所建议的那样,我也尝试过手动从设置应用程序授予权限,但这不起作用。
解决方案
在使用 getExternalStorageDirectory 保存文件之前,您需要请求权限。
将此添加到 Androidmanifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后使用permission_handler包获取Storage权限:
https://pub.dev/packages/permission_handler
如果您在模拟器中运行,getExternalStorageDirectory 将返回:
/storage/emulated/0/Android/data/com.example.myapp/files/
如果您只需要外部目录在其下创建目录,则只需使用:
/storage/emulated/0/
您可以在此文件夹下创建一个目录,以便他们的用户能够打开文件。
推荐阅读
- c# - 如何在 ASP.NET Core 中向“IConfiguration”添加新的键/值
- swift - 根据 GeometryReader 结果运行条件代码的视图扩展
- database - 标准化总是必要的和更有效的吗?
- amazon-web-services - aws cli 的未知输出
- html - 在元素 XPATH C# SELENIUM 中定位特定文本
- angular - NGRX 操作 Typescript 错误 TypeError:无法读取 Ps.get 处未定义的属性“A_”
- android - 将值从有状态类的状态传递到不同的小部件?
- c - 如何将八进制数的字符串表示形式转换为十进制?
- android - Builder.put 只能在同一个库组中调用(groupId=androidx.work)
- php - 如何在 PHP 中将 stdClass 的属性转换为某种类型?