从Android上的Documents目录中读取文件



一段时间以来,我一直在尝试如何处理Android存储,但我很难找到一个完整且最新的答案来满足一个看似简单的需求:

  1. 我想列出Documents目录的子文件夹中的文件
  2. 接下来,我只想从Documents目录中读取其中一个文件。只需将其读入一个字节[]

注意:我不希望用户选择文件!更多信息:我有两个独立的应用程序。我想让应用程序B访问应用程序A保存的文件。这样我就可以共享一些设置等等。

现在,有了整个复杂的权限和存储系统,我发现自己无法完成这项简单的任务。。。

我在Dart中使用Flutter,但我很高兴知道如何在Java中也能做到这一点。

据我所知,SAF只有在您想向用户提供文件选择器时才有用。我不想要这个。我也不想";份额;像你让用户在应用程序之间共享文件一样的文件(比如向Discord应用程序共享照片(。

我只是想让应用程序B访问我从应用程序a保存到Documents目录中的文件。并列出可用的文件以了解其中的内容。

我见过很多人问这样的问题,但我找不到一个明确、完整的答案,而不是简单地告诉我启用完整的文件访问权限,商店似乎真的不喜欢这一点,所以我想避免它。或者只在清单中启用requestLegacyExternalStorage的答案,这并不能真正起作用,据我所知,在Android 31左右之后,它可能没有用处。我想要一些清晰、健壮、适用于22岁左右之后的任何版本的Android。

旁注:我完全可以保存文件。显然安卓并不关心这个。。。

我尝试启用外部存储权限、媒体存储权限、requestLegacyExternalStorage,但没有成功。

我还尝试过使用完全的外部存储文件访问,这在技术上是可行的,但不是一个好的解决方案,因为我需要强制用户进入权限设置屏幕,而商店可能不允许。

我可以得到非常好的路径,我可以保存文件非常好。

如果我没有错的话,如果文件是从同一个应用程序保存的,我甚至可以读取它。因此,如果应用程序首先将文件保存在这个位置,它不会抱怨,并且会在不需要任何权限的情况下打开它。只有当文件是由同一应用程序制作的而不是时,才会引起问题。当我卸载该应用程序,然后重建时,它也将不再加载以前版本创建的文件。除非我弄错了

自Android 11以来:应用程序B不能简单地读取应用程序A放置在Documents目录的子文件夹中的文件。

应用程序B可以尝试列出子文件夹中的文件,但只能看到应用程序本身创建的文件。其他应用程序则不然。不是应用程序A.

您可以使用SAF ACTION_OPEN_DOCUMENT_TREE让应用程序B的用户选择子文件夹。

之后,应用程序B可以列出该文件夹中的所有文件,并可以访问所有文件。

如果你不想让应用程序B进行用户交互,那么在应用程序a中扩展ContentProvider。然后应用程序a可以将其文件提供给B。

最新更新