簡體   English   中英

Flutter - 將文件保存到下載文件夾 - downloads_path_provider

[英]Flutter - save file to download folder - downloads_path_provider

我正在使用 flutter 開發一個移動應用程序。 為此,我使用了downloads-path-provider來獲取手機的下載目錄。 模擬器返回/storage/emulated/0/Download 此外,當我在此目錄中保存文件時,該文件可以在下載文件夾中看到。

但在真實設備上,它也會返回相同的目錄路徑。 /storage/emulated/0/Download這對實際設備是否正確? 因為在實際設備上我看不到下載文件夾中保存的文件。

有什么解決方案可以在真實設備上找到下載目錄嗎?

path_provider 可能很快會發生一些變化,有一些未解決的問題:

https://github.com/flutter/flutter/issues/35783

截至目前,在 Android 設備上獲取下載路徑的最佳方法是使用:

/storage/emulated/0/Download/

不需要。

並獲取 Android 中的外部目錄路徑:

/storage/emulated/0/

“仿真”一詞並不意味着它是仿真器路徑,它只是一個命名約定。

確保您有權寫入該文件,將其添加到 manifest.xml 文件中,就在 <manifest 標記下:

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

並在運行時請求許可。

https://pub.dev/packages/permission_handler

將此添加到清單:

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

然后使用這兩個包:

  1. permission_handler 請求存儲權限
  2. 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');

這個問題和答案在 flutter 3.0+ 中被棄用: 試試這個

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';
    }
  }

一種創建或查找目錄的方法,另一種方法將查找路徑。

您可以使用“flutter_file_dialog”來處理這個問題。 成功將文件保存到應用程序后,您可以提供文件路徑到此包並將其保存在手機的另一個文件夾中。 您可以使用下面的功能; ** fromDest ** 是保存文件的路徑。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM