首页 > 解决方案 > 使用 getExternalStorageDirectory 时 Android Studio 4.1.2 中的 java.io.FileNotFoundException

问题描述

我正在尝试读取模拟器中的文本文件,但找不到该文件。getExternalStorageDirectory 不断返回此异常。要添加文件,我只需将它拖放到模拟器中,它就会显示在 Files > Downloads 文件夹中。我如何访问它?

标签: androidfileemulation

解决方案


如果您的应用面向低于 29 的 SDK。请确保您的功能类似于:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS). 这是指向Download文件夹而不是指向根文件夹。

如果您的应用以 SDK 版本 29 (Q) 为目标,则存在限制应用访问公用文件夹的隐私更改。这里解释: https ://developer.android.com/about/versions/10/privacy/changes

所以,选项是:

  1. 将不推荐使用的函数更改Environment.getExternalStorageDirectory()context.getExternalFilesDir()、 或context.getExternalCacheDir()、 或context.getExternalMediaDirs()。然后将文件放在下载文件夹中,您需要将文件放入../Android/data/com.yourpackagename/(取决于设备)
  2. 如果您仍然想使用公用文件夹并且仍然想使用getExternalStorageDirectory,请确保将android:requestLegacyExternalStorage="true"清单放入<application>标签内
  3. 如果您仍然想使用 public 文件夹,并且想摆脱 deprecated getExternalStorageDirectory,您可以使用intent ofACTION_OPEN_DOCUMENT

如果您的应用程序已经以 SDK 30 为目标,那会容易得多,因为我们现在可以直接访问文件路径。https://developer.android.com/about/versions/11/privacy/storage 因此,即使您正在使用getExternalStorageDirectory,该文件也应该可以访问,也不例外。

另外,请确保您已声明<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


推荐阅读