java - 如何创建一个文件夹并将我的应用程序生成的所有文件存储在 android q 的该文件夹中

标签 java android android-10.0

在我的应用程序中,我正在保存不同类型的图像、视频、pdf 等文件。如果目录尚不存在,我将创建一个目录,并将我的应用程序生成的文件保存在该文件夹中,以便用户可以轻松找到我的应用程序使用和创建的文件。但在 Android 10 中,我无法在外部存储中检查和创建目录。

我知道我可以在 list 中添加 android:requestLegacyExternalStorage="true" 以继续使用旧功能,但这不是永久解决方案。另外,我不想使用 getExternalFilesDir() ,因为如果用户卸载我的应用程序,此方法创建的此文件夹将被删除,并且我希望应用程序保存的文件保留在他的设备中以便这些文件可以再次使用。

这是我目前用来检查和创建我的应用程序的目录并在该目录中存储文件“myFile”的代码。

File sd =Environment.getExternalStorageDirectory();
File directory = new File(sd.getAbsolutePath() + "/" + getResources().getString(R.string.app_name));

//create directory if not exist
if (!directory.isDirectory()) {
    directory.mkdirs();
}
File file = new File(directory, myFile);

如何在 Android 10 中获得相同的结果?我真正想要的是:

  1. 检查以我的应用程序名称命名的目录是否存在。如果该目录不存在,则在设备外部存储中创建该目录。
  2. 将我的应用生成的所有文件保存在此目录中。
  3. 即使用户卸载该应用,该文件夹也不应被删除。
  4. 从此文件夹中读取文件。

最佳答案

在 Android Q 中,默认情况下,私有(private)文件夹之外的应用程序会禁用直接文件访问。您可以使用 StorageManager 类的方法 getPrimaryStorageVolume().createOpenDocumentTreeIntent() 请求访问外部主卷。在这种情况下,您需要用户同意,并且无论如何都无法直接使用 File api,但是使用 DocumentFile 类您将拥有非常相似的界面,因此这是更接近旧行为的解决方案。如果您需要在前台和后台执行操作,即除了请求权限的第一次交互之外没有用户交互,它就可以工作。 我链接Flipper库,它有助于像旧版 Android 版本一样管理文件。

关于java - 如何创建一个文件夹并将我的应用程序生成的所有文件存储在 android q 的该文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58471693/

相关文章:

java - 有...作为输入变量

android - 如何处理 WebView 未加载

android -/apex/com.android.runtime/lib64/bionic/libc.so (abort+160),在 Android 10 设备中中止崩溃

android - 未使用 android 10 推送的通知

android - java.lang.IllegalArgumentException 在 Android 10 设备中找不到卷 external_primary

Java子类最后一个实例覆盖值

java - 从二维数组中删除行

java - 内联类导致应用程序未运行

android - 未使用 GCM 接收推送通知

android - edittext setOnclicklistener android