我正在创建一个Flutter应用程序,我想在其中下载图像并将其存储到外部存储设备(而不是文档目录)中,以便任何相册应用程序都可以查看它。 我正在使用以下代码创建目录
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);
}
});
我已在设置中验证该应用程序已获得许可,也如此处的某些答案所建议,我也尝试过手动从设置应用程序授予权限,但该操作无效
答案 0 :(得分:0)
下面的代码在我的应用程序中工作正常,可以使用url将图像下载到外部存储设备
Future<bool> downloadImage(String url) async {
await new Future.delayed(new Duration(seconds: 1));
bool checkResult =
await SimplePermissions.checkPermission(Permission.WriteExternalStorage);
if (!checkResult) {
var status = await SimplePermissions.requestPermission(
Permission.WriteExternalStorage);
if (status == PermissionStatus.authorized) {
var res = await saveImage(url);
return res != null;
}
} else {
var res = await saveImage(url);
return res != null;
}
return false;
}
Future<Io.File> saveImage(String url) async {
try {
final file = await getImageFromNetwork(url);
var dir = await getExternalStorageDirectory();
var testdir =
await new Io.Directory('${dir.path}/iLearn').create(recursive: true);
IM.Image image = IM.decodeImage(file.readAsBytesSync());
return new Io.File(
'${testdir.path}/${DateTime.now().toUtc().toIso8601String()}.png')
..writeAsBytesSync(IM.encodePng(image));
} catch (e) {
print(e);
return null;
}
}
Future<Io.File> getImageFromNetwork(String url) async {
var cacheManager = await CacheManager.getInstance();
Io.File file = await cacheManager.getFile(url);
return file;
}
命名空间
import 'dart:io' as Io;
import 'package:image/image.dart' as IM;
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';
import 'package:simple_permissions/simple_permissions.dart';
希望有帮助
答案 1 :(得分:0)
使用getExternalStorageDirectory保存文件之前,您需要先请求权限。
将此添加到Androidmanifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后使用permission_handler包获取“存储”权限:
https://pub.dev/packages/permission_handler
如果您在仿真器中运行,则getExternalStorageDirectory返回:
/storage/emulated/0/Android/data/com.example.myapp/files/
如果仅需要外部目录在其下创建目录,则只需使用:
/storage/emulated/0/
您可以在此文件夹下创建目录,以便他们的用户可以打开文件。