android - 在 Android 10 中使用存储访问框架输出 URI 文件比 DocumentFile 更好的方法是什么?

标签 android storage-access-framework android-10.0 android-storage

从 Android 11 开始(API > 29),Environment.getexternalstoragedirectory() 将不再起作用。由于大多数库都使用 java.io.file 参数: Is it possible to get a regular File from DocumentFile? 我们将不得不使用文档文件。但由于它很慢,我在这里找到了最好的解决方案:https://www.reddit.com/r/androiddev/comments/725ee3/documentfile_is_dead_slow_heres/

有没有其他方法可以让我们从Android 11开始使用java.io.file的旧功能?我们如何使用文档,因为他们通过在应用程序标记中添加 android:requestLegacyExternalStorage="true"来提供仅在 Android Q/Android 10 之前的 Environment.getexternalstoragedirectory() 支持。我想知道处理文件的最佳方法。可能会与旧的 java.io.file 兼容并且需要编写更少的代码。

要打开文件夹选择器:

Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        startActivityForResult(Intent.createChooser(i, "Choose Directory"), OPEN_DIRECTORY_REQUEST_CODE);

Activity 结果:

getContentResolver().takePersistableUriPermission(
                       data.getData(),
                       Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
               );
DocumentFile documentFile = DocumentFile.fromTreeUri(this, data.getdata);

如果我尝试使用Environment.getexternalstoragedirectory()获取文件,则FileNotFound

最佳答案

Since most of the libraries are using java.io.file parameter

希望这些库中的大多数都将被重写以支持其他数据源。

Is there any other way so that we can use the old functions of java.io.file from Android 11 onwards?

通过 Context 上的方法将自己限制在文件系统中您具有读/写访问权限的部分:

  • getFilesDir()
  • getCacheDir()
  • getExternalFilesDir()getExternalFilesDirs()
  • getExternalCacheDir()getExternalCacheDirs()
  • getExternalMediaDir()getExternalMediaDirs()

对于这些目录树,您可以使用File

否则,一般来说,您对待设备的其余部分与对待 Web 没有什么不同:获取 InputStream 并“下载”内容。

关于android - 在 Android 10 中使用存储访问框架输出 URI 文件比 DocumentFile 更好的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57805075/

相关文章:

android - MonoDroid 自定义 View 不显示 child

android - Git merge 不显示服务器端代码

android - 如何更好地控制 Android SAF UI(例如 ACTION_OPEN_DOCUMENT)?

android - 对非 SAF 内容的持久权限

java - Android Q(API 级别 29)不加载 HTTPS 网站。给出错误:(net::ERR_ACCESS_DENIED)

android - 我们如何在 Android Q 中访问扩展文件?

android - 如何编写 fql 查询以列出特定位置的 friend

android - Gradle 进程 list 与新的 Manifest Merger

android - 存储访问框架不更新 MediaScanner (MTP)

Android 10 - 作为存储在应用主目录中的子进程启动可执行文件的替代方法