Flutter -将文件保存到下载文件夹- downloads_path_provider

uinbv5nw  于 2022-12-19  发布在  Flutter
关注(0)|答案(4)|浏览(397)

我正在用flutter开发一个移动的应用程序,为此我使用downloads-path-provider获取手机的下载目录,模拟器返回/storage/emulated/0/Download,并且当我在这个目录下保存文件时,该文件在Download文件夹中可以看到。
但在真实的设备上,它也会返回相同的目录路径。/storage/emulated/0/Download这对实际设备是否正确?因为在实际设备上,我看不到下载文件夹中保存的文件。
是否有任何解决方案来查找真实的设备上的下载目录?

4ngedf3f

4ngedf3f1#

path_provider可能很快会进行一些更改,但存在一些未决问题:
https://github.com/flutter/flutter/issues/35783
目前,在Android设备上获取下载路径的最佳方法是用途:

/storage/emulated/0/Download/

无需。
在Android中获取外部目录路径:

/storage/emulated/0/

“emulated”一词并不意味着它是模拟器路径,它只是一个命名约定。
确保您具有写入文件的权限,将其添加到manifest.xml文件的〈manifest标记下:

<manifest package="..." ... >
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

并且还在运行时请求许可。
参见https://pub.dev/packages/permission_handler

5w9g7ksd

5w9g7ksd2#

将此添加到清单:

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

然后使用这两个软件包:
1.请求存储权限的permission_handler

  1. downloads_path_provider将文件保存在下载目录中
    在pubspec中添加:
permission_handler: ^5.0.1+1
downloads_path_provider: ^0.1.0

那么

Future<File> writeFile(Uint8List data, String name) async {
    // storage permission ask
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      await Permission.storage.request();
    }
    // the downloads folder path
    Directory tempDir = await DownloadsPathProvider.downloadsDirectory;
    String tempPath = tempDir.path;
    var filePath = tempPath + '/$name';
    // 

    // the data
    var bytes = ByteData.view(data.buffer);
    final buffer = bytes.buffer;
    // save the data in the path
    return File(filePath).writeAsBytes(buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
  }

则使用以下方法:

var file = await writeFile(uint8List, 'name');
l5tcr1uw

l5tcr1uw3#

flutter 3.0+不赞成使用此问题与答案:try this one

Future<void> _prepareSaveDir() async {
    _localPath = (await _findLocalPath())!;

    print(_localPath);
    final savedDir = Directory(_localPath);
    bool hasExisted = await savedDir.exists();
    if (!hasExisted) {
      savedDir.create();
    }
  }

  Future<String?> _findLocalPath() async {
    if (platform == TargetPlatform.android) {
      return "/sdcard/download/";
    } else {
      var directory = await getApplicationDocumentsDirectory();
      return directory.path + Platform.pathSeparator + 'Download';
    }
  }

一种方法是创建或查找目录,另一种方法是查找路径。

dgenwo3n

dgenwo3n4#

您可以使用“flutter_file_dialog”来处理此问题,在成功将文件保存到应用程序后,您可以提供此文件包的路径并将其保存到手机的另一个文件夹中,您可以使用以下功能;fromDest是保存文件的路径。

_saveFileToDest(String fromDest) async {
   final params =
            SaveFileDialogParams(sourceFilePath: fromDest);
        final filePath = await FlutterFileDialog.saveFile(params: params);
        if (kDebugMode) {
          print(filePath);
        }
  }

相关问题