Flutter:在外部存储路径上创建目录 - 路径提供者 getExternalStorageDirectory()

Gau*_*ale 7 io storage android dart flutter

我正在创建一个 flutter 应用程序,我想在其中下载图像并将其存储到外部存储(不是文档目录),以便任何照片库应用程序都可以查看它。我正在使用以下代码创建目录

var dir = await getExternalStorageDirectory();
  if(!Directory("${dir.path}/myapp").existsSync()){
    Directory("${dir.path}/myapp").createSync(recursive: true);
  }
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

FileSystemException: Creation failed, path = '/storage/emulated/0/myapp' (OS Error: Permission denied, errno = 13)
Run Code Online (Sandbox Code Playgroud)

我已经在清单文件中设置了权限,并使用以下代码获取运行时权限

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

我已经在设置中验证了该应用程序已获得许可,也如此处的某些答案所建议的那样,我还尝试手动从设置应用程序中授予许可,但这不起作用。

liv*_*ove 5

在使用 getExternalStorageDirectory 保存文件之前,您需要请求权限。

将其添加到 Androidmanifest.xml:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

然后使用permission_handler包来获取Storage权限:

https://pub.dev/packages/permission_handler

如果您在模拟器中运行,getExternalStorageDirectory 将返回:

/storage/emulated/0/Android/data/com.example.myapp/files/
Run Code Online (Sandbox Code Playgroud)

如果您只需要外部目录在其下创建一个目录,则只需使用:

/storage/emulated/0/
Run Code Online (Sandbox Code Playgroud)

您可以在此文件夹下创建一个目录,以便用户能够打开这些文件。

  • 嘿,这对于 Android 10 设备会引发错误 (2认同)
  • 未处理的异常:FileSystemException:创建失败,路径 = '/storage/emulated/0/app_name'(操作系统错误:不允许操作,errno = 1) (2认同)

Shy*_*hil 4

下面的代码在我的应用程序中运行良好,可以使用外部存储的 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;
}
Run Code Online (Sandbox Code Playgroud)

命名空间

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';
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你