从 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/