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 解决方案,但不幸的是没有成功。

谢谢!

4

1 回答 1

0

经过进一步调查,例如 Dropbox 似乎提供了自己的用户界面来选择文件。它通过实现一个监听 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 并添加标志:Intent.FLAG_GRANT_READ_URI_PERMISSION
  • 将 uri 设置为意图的数据,并使用以下方法设置意图:setResult(Activity.RESULT_OK, result)
于 2020-06-10T20:52:17.343 回答