在Android 10中,使用Storage Access Framework输出URI文件比使用DocumentFile更好的方法是什么?

在Android 10中,使用Storage Access Framework输出URI文件比使用DocumentFile更好的方法是什么?,android,storage-access-framework,android-10.0,android-storage,Android,Storage Access Framework,Android 10.0,Android Storage,从Android 11开始(API>29),Environment.getexternalstoragedirectory()将不再工作。由于大多数库都使用java.io.file参数: 我们将不得不使用文档文件。但由于速度较慢,我在这里找到了一个顶级解决方案: 有没有其他方法可以让我们从Android 11开始使用java.io.file的旧功能?由于他们提供了Environment.getexternalstoragedirectory()支持,我们如何使用该文档,直到Android Q/A

从Android 11开始(API>29),Environment.getexternalstoragedirectory()将不再工作。由于大多数库都使用java.io.file参数: 我们将不得不使用文档文件。但由于速度较慢,我在这里找到了一个顶级解决方案:

有没有其他方法可以让我们从Android 11开始使用java.io.file的旧功能?由于他们提供了Environment.getexternalstoragedirectory()支持,我们如何使用该文档,直到Android Q/Android 10,方法是在应用程序标记中添加Android:requestLegacyExternalStorage=“true”。我想知道处理文件的最佳方法。可能是与旧的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);
OnActivityResult:

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

因为大多数库都使用java.io.file参数

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

有没有其他方法可以让我们从Android 11开始使用java.io.file的旧功能

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

  • getFilesDir()
  • getCacheDir()
  • getExternalFilesDir()
    getExternalFilesDir()
  • getExternalCacheDir()
    getExternalCacheDirs()
  • getExternalMediaDir()
    getExternalMediaDir()
对于这些目录树,您可以使用
文件


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

您能分享InputStream方式的示例代码吗?谢谢你的Commonware,我已经浏览了你的博客,发现它非常有用,非常棒!继续做好工作。@cooldev:“您能以示例代码的方式共享InputStream吗?”--
getContentResolver()。openInputStream(您的Uri)
为您提供了一个关于
Uri
标识的内容的
InputStream
。在
上下文上调用
getContentResolver()
@commonware例如,whatsapp当前正在外部存储器中存储数据,对吗?那样的话,他们将如何处理?如果我想在外部存储器中创建我自己的文件夹,我该怎么做?@VivekMVK:“whatsapp当前正在外部存储器中存储数据,对吗?”——我不使用whatsapp,所以我无法回答这个问题。“如果我想在外部存储中创建自己的文件夹,我该怎么做?”——在接下来的12个月内,您可以在清单中的
元素上使用
android:requestLegacyExternalStorage=“true”
。除此之外,使用
ACTION\u OPEN\u DOCUMENT\u TREE
,让用户决定将用户内容存储在用户设备(或者用户的云服务)的何处。