java - Android 11 存储访问和 Java 文件库
问题描述
我在 Playstore 上已经有一个 android 应用程序。它是一个使用 localhost 在 PC 和 Android 之间传输文件的应用程序。我在其中使用了以下java函数:
创建目录/文件/显示文件列表和许多其他文件功能(追加、字节读/写等):
file.mkdir
directory.listFiles();
file.createNewFile()
我也放了
requestLegacyExternalStorage="true"
在给予足够的读/写外部存储权限后,它在 android 10 上运行良好。
但问题是这些在 android 11 上不起作用,因为 requestLegacyExternalStorage 不起作用。我使用了 MANAGE_EXTERNAL_STORAGE 并且该应用程序运行良好,但问题是 Playstore 不允许它。(不知道他们为什么拒绝更新)
我也使用了 getExternalFilesDir ,它运行良好,但不喜欢数据位于 android 文件夹中,如果应用程序被删除则删除。
我也尝试使用下载位置并且它可以工作,但问题是不推荐使用 getExternalStorageDirectory:
File file = new File(Environment.getExternalStorageDirectory()+"/"+Environment.DIRECTORY_DOWNLOADS,"FileChat");
所以我想问我如何管理/使用 android 11 的文件库来读取/写入/创建/删除文件和目录。它不应该在 android 文件夹中,因为它会在应用程序被删除后被删除。我可以像下载一样使用公共目录吗?如果可以,getExternalStorageDirectory() 的替代方法是什么?
我不需要读取用户数据。只想有一个目录,应用程序可以在其中存储文件。读取功能正在工作,因为用户使用意图选择了文件。
提前致谢。
解决方案
共享存储的顶级目录写入权限在 Android 11 中不可用,但是您可以使用现有的文件 API 来访问媒体和下载集合文件夹,如、/Pictures
等。无法将应用程序自己的文件夹创建为顶级目录,但可以在默认集合文件夹中创建专用子目录。/Downloads
/DICM
为了让您的应用在 Android 10 上按预期运行,requestLegacyExternalStorage
还需要标记,因为仅通过 MediaStore API 限制了对 Android 10 上共享存储的访问。
推荐阅读
- airflow - apache气流设置中的导出命令是什么
- reactjs - 有没有办法使用 React 测试库测试组件中的非导出函数?
- c# - 使用没有数据库的组合框下拉列表显示 gridview
- listview - 如何在颤动中滚动到列表末尾时显示加载指示器
- python-3.x - 如何在 csv 文件中找到特定行并将这些行中的某些值相加?
- linux - 如何过滤正在运行的节点
- html - 如何将 left 属性设置为等于内容的宽度
- javascript - Gulp 4 多个异步子任务
- c - 我怎样才能知道尝试是否是 UB 以及如何避免它们?
- javascript - 如何在锚标记悬停时添加类