java - Android 上的 Flutter path_provider 错误,而在 iOS 上运行完美

标签 java android flutter dart java-io

我在我的 Flutter 应用程序中使用 [flutter_pdfview][1] 包,以显示从互联网下载的 PDF 文件。我使用 path_provider 包下载文件并将其存储在设备中。

在 iOS 上运行应用程序时,这两个包都工作得很好,但是当我在 Android 上运行它时(在 VSCode 中的 Android 模拟器中),path_provider 似乎无法加载文件。

在控制台中我收到此错误消息:

[onError, {error: java.io.FileNotFoundException: No content provider: thisIsMyFilePath}]

我正在这样下载和保存文件:

Future<File> getFileFromUrl(String url, {name}) async {
    var fileName;

    if (name != null) {
      fileName = name;
    }

    try {
      var data = await http.get(url);
      var bytes = data.bodyBytes;
      var dir = await getApplicationDocumentsDirectory();
      File file = File("${dir.path}/" + fileName + ".pdf");
      print(dir.path);
      File urlFile = await file.writeAsBytes(bytes);
      return urlFile;
    } catch (e) {
      throw Exception("Error opening url file");
    }
}

任何人都知道这里的 Android-only 错误是什么?也许我需要向 list 中添加一些我不知道的东西?

非常感谢! [1]: https://pub.dev/packages/flutter_pdfview

编辑:Alberto Miola 回答

var data = await http.get(url);
      var bytes = data.bodyBytes;
      var dir = await getApplicationDocumentsDirectory();
      final name = p.join(dir.path, fileName + ".pdf");//From Alberto Miola's answer
      File file = File(name);
      print(dir.path);
      File urlFile = await file.writeAsBytes(bytes);
      return urlFile;
    } catch (e) {
      throw Exception("Error opening url file");

最佳答案

在使用文件系统时,安全的跨平台解决方案涉及使用 path_provider(如您所用)和 path .

import 'package:path/path.dart' as p;

导入后,您可以使用 join 安全地“链接”路径,这样您的代码将变为:

final name = p.join(dir.path, filename + ".pdf");
final file = File(name);

基本上 join 决定了如何在底层操作系统上正确创建文件路径,您应该依赖它而不是手动编写斜线。此外,请确保您拥有 list 文件的写入和读取权限。

关于java - Android 上的 Flutter path_provider 错误,而在 iOS 上运行完美,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62502472/

相关文章:

Java比较整数和bigInteger

java - eclipse 找不到包和类

java - 解析 xml : attributes. getValue() 返回 null?

android - RenderCustomMultiChildLayoutBox 对象在布局期间被赋予了无限大小。 flutter 错误

android - 如何在 Flutter 中完全取消对 TextField 的关注,而无需稍后返回焦点

java - 如何解决这个无限 while 循环?

java - AEM 查询生成器类返回

java - 如何在 X 秒后消除 Google Glass 中的静态卡?

java - 在两个不同的 Activity 中使用 SQLiteOpenHelper 的单个实例的最佳方法是什么?

flutter - 如何同时实现拖动和点击