带有自定义文件系统的 Android 存储访问框架

Posted

技术标签:

【中文标题】带有自定义文件系统的 Android 存储访问框架【英文标题】:Android Storage Access FrameWork with custom file system 【发布时间】:2016-10-14 14:20:12 【问题描述】:

我正在使用 android Storage Access Framework API 来访问插入到 android 中的外部大容量存储 USB 驱动器。

我的问题是,如果 USB 驱动器包含 android 不理解的文件格式,我还能访问外部 USB 驱动器上的文件吗?

我能否编写自己的低级函数来访问 android Storage Access FrameWork 不知道文件格式的驱动器?

假设我出于安全原因创建了自己的驱动器格式,Android 将如何显示向用户显示文件内容的对话框,以便他们可以选择一个文件,授予应用程序访问该文件的权限,它不知道文件格式驱动器?

谢谢

【问题讨论】:

【参考方案1】:

如果 USB 驱动器包含 android 不理解的文件格式,我仍然可以访问外部 USB 驱动器上的文件吗?

是的。

我能否编写自己的低级函数来访问 android Storage Access FrameWork 不知道文件格式的驱动器?

您必须使用低级 USB APIs 编写自己的 USB 驱动程序(正如您所说,Android 不知道如何读取您的 USB 驱动器)

假设我出于安全原因创建了自己的驱动器格式,Android 将如何显示向用户显示文件内容的对话框,以便他们可以选择一个文件,授予应用程序访问该文件的权限,它不知道文件格式驱动器?

DocumentsProvider API 中的任何内容都没有控制如何从磁盘读取文件(如果它们甚至是从磁盘读取的 - 在许多情况下,例如使用 Google Drive DocumentsProvider,它们是从远程服务器读取的)。只要通过从queryRoots() 为根返回一个Cursor,为单个文档返回一个Cursor 和queryDocument() 的正确字段,以及一个带有来自queryChildDocuments() 的文档列表的Cursor 来满足API ,那么存储访问框架将正确列出您的文件。

只需确保您向openDocument() 提供有效的ParcelFileDescriptor,这将允许对您的自定义文件格式系统进行读/写访问。

【讨论】:

非常感谢您的回答和帮助。但是您是说android 6.0.1和Storage Access FrameWork允许应用程序编写自己的低级USB(批量传输等)来直接访问插入android的USB驱动器?我以为低级 USB 功能被阻止了,我们只能使用存储访问框架来获取 USB 文档的 uri,并且通过 uri 访问所有内容? 我想为了访问插入到android的USB驱动器上的文件,首先android操作系统会向用户显示一个对话框(自己),当用户选择一个文件时,然后android 操作系统仅向应用授予对该文件的访问权限。那么如果Android操作系统无法从U盘中读取文件名(可能是因为整个U盘都被加密了),那么它将如何将文件名呈现给用户呢?也许我没看错,但你说的确实有道理,但我对这一切真的很陌生。 您选择了一个几乎没有开发人员去过的领域,并且几乎没有文档或支持。存储访问框架的全部意义在于抽象任何设备或文件存储。框架本身使用它来提供对 SD 卡和附加 USB 存储设备的访问(因为没有对这些位置的直接文件访问)。这与您为自定义 USB 设备提供自己的驱动程序完全不同。 ianhanniballake - 非常感谢您的 cmets,您是说 Android 允许我们编写自己的低级 USB 代码来访问可能具有自定义格式(或加密)的驱动器?我认为他们阻止了所有这些,唯一的方法是使用有根的 Android?我怎么写一个Android驱动,我以为android中的所有应用程序代码都是应用程序级别的? 我们正在制作一个商业应用程序,因此我们不能要求客户必须根他们的安卓手机才能使用我们的应用程序。

以上是关于带有自定义文件系统的 Android 存储访问框架的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 OData 提要 C# 的存储过程的自定义分页,没有实体框架

使用Google云端硬盘上的存储访问框架存储文件

使用带有自定义域的私有谷歌云存储

我可以在包中嵌入自定义字体并从 ios 框架访问它吗?

Xutils-Android中数据存储和网络传输的框架

在 Android 中使用存储访问框架保存文件