[英]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" />
並在運行時請求許可。
將此添加到清單:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
然后使用這兩個包:
在 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.