【问题标题】:Content Uri vs. File Uri: What to use in the future?Content Uri vs. File Uri:未来用什么?
【发布时间】:2016-01-05 22:34:59
【问题描述】:

我正在开发一个安卓相机应用程序,我们在几个场景中使用了 uris,例如将结果数据从我们的相机传送回启动我们的应用程序以获得结果或当用户单击共享按钮时打开 IntentChooser。

目前我们在大多数情况下使用 File Uris,因为它似乎是更安全的解决方案。使用 ContentResolver 和 MediaStore 总是会出错。另外我记得前段时间有不少app,不支持Content Uris,但是File Uris很好。

但是,我们现在收到 Google 的邮件,当用户决定在 Android 6.0 上不授予“环聊”文件访问权限时,使用 File Uris 交付不允许他们的“环聊”应用访问该文件。

我现在的问题是:在向其他应用程序交付内容时,我们通常应该从 File Uris 切换到 Content Uris 吗?这是要走的路吗?每个应用都应该依赖/支持 Content Uris 吗?

【问题讨论】:

标签: android android-contentprovider file-permissions android-6.0-marshmallow file-uri


【解决方案1】:

是的,内容网址是要走的路。

对于相机应用程序,我不确定文件 url 是否非常合理 - 将文件传递给调用应用程序后,您怎么知道何时可以删除该文件?使用内容 url,调用应用程序通过 url 请求数据,当您交付它时,您可以释放您的资源副本。 (如果应用程序想要“永久”访问通过内容 url 访问的数据,则由它自己保存该数据)。

【讨论】:

  • 所以有某种约定,内容 uri 是高度临时的,而文件 uri 不是?否则,我应该如何知道我的 Content Uri 的接收者何时使用完它?
  • 所有的 url 都是临时性的——如果你想保证从一个 url 中获得相同的数据,那么你可以缓存这些数据,而不是多次请求它。在文件 url 的情况下,因为它们只是指向文件,人们最终会使用它们,而不会通知您(作为提供者)他们已经使用过它们,因此您没有很好的触发器来确定何时可以删除底层文件(通常用户很懒惰,并认为该文件是数据的足够好的兑现副本)。
  • 好吧...听起来提供商可以确定何时使用了他提供给另一个应用程序的内容 uri。你能给我一个提示吗?感谢您的努力!
【解决方案2】:

您应该使用内容 uri 在应用程序之间交换文件。从 Android 7.0 开始,在将文件 uri 传递到应用程序之外时,您将收到 FileUriExposedException。 这是behaviour changes starting android 7.0的摘录

对于面向 Android 7.0 的应用,Android 框架会强制执行 StrictMode API 政策,该政策禁止在您的应用之外公开 file:// URI。如果包含文件 URI 的意图离开您的应用程序,则应用程序将失败并出现 FileUriExposedException 异常。

要在应用程序之间共享文件,您应该发送一个 content:// URI 并授予对 URI 的临时访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2016-02-13
    • 2014-07-15
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    相关资源
    最近更新 更多