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

8

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

当从 Chrome 浏览器分享搜索图片时,应用程序接收到一个带有此类 Content URI 的意图: content://com.android.chrome.FileProvider/images/screenshot/1457448067808912906311.jpg

我该如何从这种类型的 Content URI 中获取文件路径? Facebook、Google+ 等所有其他应用程序都可以做到。 我正在使用FileChooser来获取其他类型的 Content URI(例如从 Gallery 中获取)的文件路径。

尝试了各种方法,但没有多少帮助。 有人能建议一下如何处理这些 Content URI 吗?

2个回答

6
如果您绝对需要文件的本地副本,您将需要打开InputStream,将内容复制到您知道路径的本地文件中,然后从那里开始。顺便说一下:Guava的ByteStreams#copy是实现这一目标的简单方法。
当然,此文件不再由原始Uri源支持,因此我认为这不是您想要的。相反,您应该使用Uri的预期API。请查看存储访问框架编辑 以下是如何从您的Uri获取InputStream的方法。
InputStream inputStream = getContentResolver().openInputStream(uri);

不,你是对的。也许这就是我想要的! 我需要在我的应用程序中将图像附加到帖子并上传到s3存储桶。为此,我将需要文件路径。 感谢您的建议,我会尝试一下。 如果使用此方法附加多个图像,是否会出现性能问题? - Priya Mall
正如@CommmonsWare所提到的,您可以上传一个InputStream(https://github.com/aws/aws-sdk-android/blob/master/aws-android-sdk-s3/src/main/java/com/amazonaws/services/s3/model/S3Object.java#L107-L117)。我已更新我的答案以包含如何获取`InputStream`。 - Scott Tomaszewski
如果这是正确的答案,你能接受它吗?@Priya - Scott Tomaszewski
我之前一直在使用openInputStream,它一直很好用。但是我最近再次测试时,却出现了Security Exception的错误。我遇到了和这个 SO问题完全相同的问题。你能帮忙解决吗? - Priya Mall
你应该打开第二个问题,发布你拥有的代码、你得到的堆栈跟踪和问题的描述。这将更容易回答,并帮助未来遇到类似问题的开发人员。谢谢! - Scott Tomaszewski

4
我该如何从这种类型的内容URI中获取文件路径?
你不能,因为在Uri后面可能根本没有文件,更不用说你能访问的文件。这个Uri可能指向:
  • 外部存储器上的本地文件
  • 其他应用程序内部存储器上的本地文件
  • 可移动存储器上的本地文件
  • 需要即时解密的加密本地文件
  • 数据库中BLOB列中保存的字节流
  • 其他应用程序需要先下载的内容片段
  • 等等
所有其他应用程序(如Facebook、Google+)都这样做吗?
不是的。它们使用ContentResolver和以下方法:
  • openInputStream()读取与内容相关联的字节
  • getType()获取与内容关联的MIME类型
  • query()OpenableColumns获取与内容关联的大小和显示名称

谢谢您解释这个概念,现在我已经清楚明白了。实际上,我需要将图像附加到一个帖子中,并在我的应用程序中上传到s3存储桶。为此,我将需要文件路径。我认为我应该尝试@Scotty的建议,您有什么建议? - Priya Mall
1
@Priya:看起来Amazon S3 SDK支持使用“InputStream”设置“S3Object”的内容。如果是这样,您就不需要文件,只需要从“openInputStream()”获取“InputStream”。 - CommonsWare
是的,你说得对。谢谢! 我猜只能接受一个答案而不能两个都接受。 所以只是注释掉...接受的答案 :) - Priya Mall
我之前使用openInputStream时一切正常。但是我再次测试时,现在却抛出了安全异常。遇到了与这个Stack Overflow问题相同的问题。 你能帮我解决吗? - Priya Mall

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