从内容 URI 获取搜索图像的绝对文件路径

Getting the Absolute File Path from Content URI for searched images

我正在尝试使用隐式意图将图像从其他应用程序共享到我的应用程序 ACTION_SEND

从 chrome 浏览器共享搜索图片时,应用会收到带有如下内容 URI 的意图: content://com.android.chrome.FileProvider/images/screenshot/1457448067808912906311.jpg

如何从这种类型的内容 URI 中获取文件路径? 所有其他应用程序,如 Facebook,Google+ 都在这样做。 我正在使用 FileChooser 获取其他类型的内容 URI 的文件路径(例如,来自图库)。

试着四处寻找,但没有太多帮助。 有人可以建议如何使用这些内容 URI 吗?

How can I fetch file path from this type of Content URI?

不需要,因为 Uri 后面根本不需要文件,更不用说您可以访问的文件了。 Uri 可能指向:

  • 外部存储上的本地文件
  • 另一个应用程序的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 本地加密文件,需要即时解密
  • 数据库中 BLOB 列中保存的字节流
  • 一段内容需要对方先下载
  • ...等等

All other apps like Facebook, Google+ are doing it

不,他们不是。他们正在使用 ContentResolver 和:

  • openInputStream() 读取与内容关联的字节
  • getType() 获取与内容关联的 MIME 类型
  • query()OpenableColumns 获取与内容关联的大小和显示名称

如果您绝对需要文件的本地副本,则需要打开 InputStream 将内容复制到您知道路径的本地文件,然后从那里开始。旁注:Guava 的 ByteStreams#copy 是实现此目的的简单方法。

当然这个文件已经没有原来的Uri源支持了,所以我认为这不是你想要的。相反,您应该使用 Uri 的预期 API。看看 Storage Access Framework

编辑

以下是如何从 Uri

中获取 InputStream
InputStream inputStream = getContentResolver().openInputStream(uri);