7

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

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

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

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

4

2 回答 2

5

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

当然,这个文件不再由原始 Uri 源支持,所以我认为这不是你想要的。相反,您应该使用 Uri 的预期 API。查看存储访问框架

编辑

以下是如何InputStream从您的Uri

InputStream inputStream = getContentResolver().openInputStream(uri);
于 2016-03-08T15:23:46.380 回答
4

如何从这种类型的内容 URI 中获取文件路径?

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

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

Facebook、Google+ 等所有其他应用程序都在这样做

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

  • openInputStream()读入与内容相关的字节
  • getType()获取与内容关联的 MIME 类型
  • query()以及OpenableColumns获取与内容关联的大小和显示名称
于 2016-03-08T15:08:23.517 回答