内容 Uri vs. 文件 Uri:未来应该使用哪个?

7
我正在开发一个安卓相机应用,我们在多种场景下使用URI,例如从我们的相机返回结果数据到启动我们为结果的应用程序,或者当用户单击分享按钮时打开IntentChooser。

目前,我们在大多数情况下使用文件URI,因为这似乎是更安全的解决方案。使用ContentResolver和MediaStore总有些事情可能会出错。此外,我记得一段时间以前有很多应用程序不支持Content Uris,但是非常支持文件Uris。

然而,谷歌给我们发送了邮件,指出使用文件URI无法让“Hangouts”应用程序访问该文件,当用户在Android 6.0上决定不授予“Hangouts”文件访问权限时。

我的问题是:我们是否应该通常从文件URI切换到Content URI在向其他应用传递内容时?这是正确的方法,每个应用程序都应该依赖/支持Content URI吗?


3
https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html - CommonsWare
2个回答

5

是的,内容Url是正确的选择。

对于相机应用程序而言,我不确定文件Url是否一直都很明智-将文件传递给调用应用程序后,您如何知道何时可以删除该文件?通过内容Url,调用应用程序通过Url请求数据,当您传递数据后,可以释放资源的副本。(如果应用程序想要通过内容Url访问的数据具有“永久”访问权限,则由其自己保存该数据)。


那么有一种协议,即内容 URI 是高度临时的,而文件 URI 不是吗?否则,我怎么知道我的内容 URI 的接收者何时停止使用它呢? - mAx
所有的URL都是临时的 - 如果您想保证从URL获取相同的数据,则应缓存该数据,而不是多次请求它。在文件URL的情况下,由于它们只是指向文件,人们会在未通知您(作为提供者)的情况下使用它们,因此您没有很好的触发器可以告诉您何时可以删除底层文件(而且通常用户很懒,认为文件是数据的足够缓存副本)。 - zmarties
好的...听起来供应商可以确定他提供给另一个应用程序的内容URI何时被使用。你能给我一些提示怎么做吗?感谢你的帮助! - mAx

4
您应该使用内容URI来在应用程序之间交换文件。从Android 7.0开始,如果将文件URI传递到应用程序外部,您将收到FileUriExposedException异常。
以下是来自Android 7.0行为变更的摘录:
“对于针对Android 7.0的应用程序,Android框架执行StrictMode API策略,禁止在应用程序外部公开file:// URI。如果包含文件URI的意图离开您的应用程序,则该应用程序将失败并抛出FileUriExposedException异常。”
“要在应用程序之间共享文件,您应该发送content:// URI,并授予URI的临时访问权限。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接