首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确实现openDocument的DocumentsProvider

正确实现openDocument的DocumentsProvider
EN

Stack Overflow用户
提问于 2020-06-10 11:37:56
回答 1查看 380关注 0票数 0

我正在编写一个示例应用程序,它实现了一个DocumentsProvider,使用SAF框架与其他应用程序共享文件。代码可以在这里找到:DocumentsProvider示例项目

例如,我在与Gmail共享所选文件时遇到了问题。根据我在openDocument中使用的方法(参见示例项目中的openDocument函数),我得到了不同的结果(参见上面链接中的代码)。

总结如下:

1)当我读取文件的内容并返回时

ParcelFileDescriptor.open(文件,ParcelFileDescriptor.parseMode(模式))

它从Gmail开始工作。这是使用readFilesUsingOpenDocumment()函数。

2)当我阅读内容并使用createReliablePipe时,我可以在示例应用程序中获取内容,但不能在Gmail中获取内容,这会给出以下例外情况:

2020-06-10 09:15:31.643 14097-14235/nl.jcraane.myapplication E/AndroidRuntime:致命异常: AsyncTask #2进程: nl.jcraane.myapplication,PID: 14097引起: java.io.IOException:写失败: EPIPE (断管)

这是使用readFileUsingReliablePipe()函数。

3)当我使用createReliablePipe而不使用ASyncTask时,当传输大量(超过两Kb)的数据时,应用程序会挂起。

有没有人对如何实现openDocument有更深入的见解?理想情况下,我还希望通过URL下载文件,并在下载完成后返回字节。是否有可能让调用应用程序知道下载正在进行(显示进度条)?如何正确使用createReliablePipe?

我确实看过Samba文档提供程序,我从它那里获得了ASyncTask解决方案,但不幸的是没有成功。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-06-10 20:52:17

经过进一步的调查,例如,Dropbox似乎为选择文件提供了自己的UI。它通过实现一个监听GET_CONTENT和OPEN_DOCUMENT意图操作的活动来实现这一点。我在这个示例项目中添加了这个原则的示例实现:DocumentsProviderExample,这样,如果需要从网络下载文件,您也可以显示下载进度。要真正共享文件,必须执行以下步骤(在上面的示例项目中可以找到这些步骤):

  • 创建用户可以选择要与其他应用程序共享的文件的活动。
  • 使用意图操作GET_CONTENT和OPEN_DOCUMENT在清单中注册此活动
  • 使用provider_paths.xml将文件提供程序添加到清单中。这是从文件中创建可共享的url所必需的。
  • 当用户选择一个文件时,将该文件复制到provider_paths.xml中定义的路径,例如应用程序缓存文件夹(如示例项目中所做的)
  • 调用:val uri = FileProvider.getUriForFile(this, "nl.jcraane.myapplication.provider", file)来创建一个内容:// uri
  • 创建一个意图并添加标志: Intent.FLAG_GRANT_READ_URI_PERMISSION
  • 将uri设置为意图上的数据,并使用:setResult(Activity.RESULT_OK, result)设置意图
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62302642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档