我正在编写一个示例应用程序,它实现了一个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解决方案,但不幸的是没有成功。
谢谢!
发布于 2020-06-10 20:52:17
经过进一步的调查,例如,Dropbox似乎为选择文件提供了自己的UI。它通过实现一个监听GET_CONTENT和OPEN_DOCUMENT意图操作的活动来实现这一点。我在这个示例项目中添加了这个原则的示例实现:DocumentsProviderExample,这样,如果需要从网络下载文件,您也可以显示下载进度。要真正共享文件,必须执行以下步骤(在上面的示例项目中可以找到这些步骤):
val uri = FileProvider.getUriForFile(this, "nl.jcraane.myapplication.provider", file)来创建一个内容:// urisetResult(Activity.RESULT_OK, result)设置意图https://stackoverflow.com/questions/62302642
复制相似问题