Android FileOutputStream return api 级别 22 中的 FileNotFoundException

Android FileOutputStream return FileNotFoundException in api level 22

我正在尝试从服务器下载 pdf 文件。我为此写了一些代码。它适用于 api 级别 21 和 >=23 但不适用于 api 22。问题是:

OutputStream output = new FileOutputStream(fileName);
byte data[] = new byte[1024];

while ((count = input.read(data)) != -1) {
   output.write(data, 0, count);
}

但是当它尝试执行时

 OutputStream output = new FileOutputStream(fileName); 

显示

java.io.FileNotFoundException: /storage/emulated/0/data    /data/com.example.test/files/training/training.pdf: open failed: ENOENT (No such file or directory)

这适用于 api 级别 21 和 23。哪里出了问题?我该如何解决?

before calling FileOutputStream() i am calling this public void createDirectory() { File directory = new File(getFilesDir() + "/training"); if (!directory.exists()) { directory.mkdir(); } }

这不是您要写入文件的位置:

String root = Environment.getExternalStorageDirectory().toString(); String path = path = "/training/training.pdf"; String fileName = fileName=root+"/"+getFilesDir()+path;

如您所见,这些不匹配。


如果您想要 external storage 上的文件,最好的解决方案是摆脱所有这些并使用 getExternalFilesDir(),调用 Context(类似于 getFilesDir()).这给你:

  • 一个独特的目录
  • 在外部存储上
  • 当您的应用程序被卸载时,文件将被删除的位置
  • 不需要 Android 4.4+
  • 的许可

外部存储的下一个最佳解决方案是摆脱所有这些并使用 Environment.getExternalStoragePublicDirectory() 作为基础,根据文件类型(例如照片、视频)将文件放在标准位置, 音乐)。这些文件将在卸载后继续存在,并且此位置将需要 WRITE_EXTERNAL_STORAGE。另外,您必须自己在这个根目录下创建一个唯一的子目录,尽管通常这是通过用户友好的显示名称(例如 OpenCamera)而不是包名称来完成的。

您在 createDirectory() 中创建的目录完全没问题,但它是 internal storage,因此用户无法访问它。如果您想使用它,请使用 相同的算法 为您的 FileOutputStream 创建 File,就像您在 createDirectory() 中使用的那样。