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

Posted

技术标签:

【中文标题】在 Android 中使用存储访问框架保存文件【英文标题】:Saving file using Storage Access Framework in Android 【发布时间】:2015-06-28 22:59:00 【问题描述】:

我正在将文档访问框架与我的云存储访问应用程序集成。 使用this 文档我已经能够访问该文件并检索它(我只是使用Gmail 应用程序的附加功能来检查这一点)。

我现在正在尝试寻找如何使用相同的方法保存文件(通过应用程序直接将文件保存到云存储),并且我做了以下更改:

对于 getRoots 调用,

row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE);

我还重写了createDocument 方法。

我没有看到太多关于如何执行此操作的示例代码或文档。我还看到像“照片”应用程序这样的一堆应用程序有“共享”按钮,它们使用不同的方法(日志显示 miniShareActivity),而我的应用程序没有显示出来(看起来它使用了不同的文件共享机制)

我正在寻找关于

的信息

    如何使用 SAF 来存储文件(任何示例文件都很好或指向文档)。我假设它将允许用户使用选择器界面导航到文件夹并存储文件。

    如何让应用程序显示在应用程序的“Minishare 活动”列表中以将文件导入应用程序(看起来它不提供选择器界面但我仍然想提供支持所以文件被保存到默认位置)

【问题讨论】:

我怀疑,基于developer.android.com/guide/topics/providers/… 上的“获取输入流”和“创建新文档”示例,您会想要执行后者,然后是 getContentResolver().openOutputStream( uri);关键点是,虽然您可以以与 File 非常相似的方式读取和写入结果,但不一定总是有任何方法可以获取与其对应的文字 java.io.File。 这些示例是从客户端应用程序的角度来看的,但我正在尝试查看文档提供者方面需要哪些其他设置。具有客户端和提供者端代码的示例将是理想的 这可能对你有帮助:techotopia.com/index.php/… 【参考方案1】:

您在其他应用程序中引用的共享按钮可能使用ACTION_SEND 作为 Intent 操作,而不是随存储访问框架引入的ACTION_CREATE_DOCUMENT。

您可能希望同时支持这两者,因为 ACTION_CREATE_DOCUMENT 仅在 KitKat 中引入,而较旧的应用程序可能不知道它。同样,您可能还希望支持 Intent 操作 ACTION_GET_CONTENT 以在 KitKat 之前的设备上进行读取访问(在 KitKat+ 上运行时,ACTION_GET_CONTENT 由 SAF 处理,但在 KitKat 之前的设备上运行时,您的应用仍需要处理它)。您的 AndroidManifest 中的 <intent-filter>s 是否设置为匹配所有这些 Intent 类型?

【讨论】:

以上是关于在 Android 中使用存储访问框架保存文件的主要内容,如果未能解决你的问题,请参考以下文章

尝试将数据保存到 android 设备上的可访问文件

Android 权限常量保存在哪个类中

Android - 将原始资产中的文件保存到外部存储以供其他应用访问,导致找不到内容根异常

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

将字符串保存到内部存储上的特定文件夹 - Android

将文件保存在设备存储上