java.io.FileNotFoundException 在 Android Studio 4.1.2 中使用 getExternalStorageDirectory

java.io.FileNotFoundException in Android Studio 4.1.2 when using getExternalStorageDirectory

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

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

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

所以,选项是:

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

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

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