如何在 Android 11 上获取可读文件

Posted

技术标签:

【中文标题】如何在 Android 11 上获取可读文件【英文标题】:How to get readable File on Android 11 【发布时间】:2021-11-15 10:50:10 【问题描述】:

除了请求 MANAGE_EXTERNAL_STORAGE 权限外,android 11 上是否有任何方法可以获取某些非媒体文件的可读 File.class?

使用Storage Access Framework 和DocumentFile 我可以获得Uri(canRead 和canWrite 都返回true),但是当我将它转换为File 时,canRead 和canWrite 都返回false(存在返回true)。

我的应用程序正在使用的文件是用户在他们的计算机上创建的大型 SQLite 数据库,我只读取它们(如果有什么不同的话),但为了做到这一点,我需要 File,而不是 Uri。

目前,我的选择是:

    让我的用户想办法将文件直接复制到数据/数据目录(计算机和大多数文件管理器都看不到) 将文件(使用输入/输出流)复制到数据/数据目录(这意味着 500MB 文件将占用设备上 1GB 的内部存储空间) 申请 MANAGE_EXTERNAL_STORAGE 权限,我怀疑 Google 会批准

我错过了什么吗?

【问题讨论】:

您的问题可能源于when I convert it to File。以下可能也不正确but in order to do that, I need File, instead of Uri。您提到canRead 返回true,您还提到which I only read。如果canRead 返回 true 而您只想阅读它,那么是什么阻碍了您... 我认为你不明白这个问题。我不想保存 Uri,我想从 SQLite 数据库中读取数据。正如我所说,我的问题不在于 SAF,我提示用户许可以及 takePersistableUriPermission(),将其保存到 SharedPreferences,从中读取,并且 Uri 对 canRead 和 canWrite 都返回 true。 【参考方案1】:

我也有同样的问题。应用程序 A 在某处创建一个 SQL 数据库文件,例如“Music/Bla/mydatabase.db”。现在应用程序 B 必须读取该文件并且不能。那么有哪些选择呢?

    申请 MANAGE_EXTERNAL_STORAGE PERMISSION 并通过 F-Droid 或可下载的 apk 提供您的应用程序,因为 Google 将拒绝在 Play 商店中发布它。 声明目标 API 29 和旧版访问权限并通过 F-Droid 或可下载的 apk 提供您的应用程序,因为 Play 商店不允许发布 API 29 或更低版本的新应用程序或更新。 使用专有的 SAF 方法将数据库文件复制到应用程序的私有目录树并从那里打开它。 使用 ios。 也许更多。

一般来说,Google 的文件访问策略对开发人​​员(使编程复杂)和用户(使程序变慢)来说都是一种痛苦。

PS:.jpg 文件存在类似问题。给定路径,文件无法打开。被告知在媒体存储中的某处有一个解决方案,无论 API(谷歌:“媒体的原始文件路径访问”),但我找不到它,因为文档不足并且缺乏可用的示例。

【讨论】:

以上是关于如何在 Android 11 上获取可读文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Play 商店更新我的应用程序后,如何在 Android 上保存 QSettings 文件的内容以使其可读?

Android中如何设置SharedPreference文件名称?

如何在 Android 中获取视频的位置数据?

如何在 Android 上获取和修改元数据以支持音频文件?

我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件

如何在 Android 中获取 SD 卡上文件夹的大小?