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

Posted

技术标签:

【中文标题】从内容 URI 中获取搜索图像的绝对文件路径【英文标题】:Getting the Absolute File Path from Content URI for searched images 【发布时间】:2016-06-22 14:26:55 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

谢谢你解释这个概念,现在我明白了。实际上,我必须将图像附加到帖子并上传到我的应用程序中的 s3 存储桶。为此,我需要文件路径。我想,我应该试试@Scotty 的建议,你有什么建议? @Priya:看起来确实像Amazon S3 SDK supports InputStream for setting the contents of an S3Object。如果是这样,您不需要文件。您只需要来自openInputStream()InputStream 是的,你是对的。谢谢!我想,只能接受一个答案,不能同时接受。所以只是评论出来..接受的答案:) 我使用的是 openInputStream 并且工作正常。但是我再次对其进行了测试,现在它抛出了安全异常。面临与this SO 问题完全相同的问题。你能帮忙吗?【参考方案2】:

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

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

编辑

您可以通过以下方式从您的Uri 获取InputStream

InputStream inputStream = getContentResolver().openInputStream(uri);

【讨论】:

不,你是对的。也许,这就是我想要的!我必须将图像附加到帖子并上传到我的应用程序中的 s3 存储桶。为此,我将需要文件路径。感谢您的建议,将尝试一下。如果使用这种方法要附加多个图像,是否会出现一些性能问题? 正如@CommmonsWare 提到的,您可以上传InputStream (github.com/aws/aws-sdk-android/blob/master/aws-android-sdk-s3/…)。我已经更新了我的答案,包括如何获得 InputStream 如果这是正确答案,你能接受吗? @Priya 我使用的是 openInputStream 并且工作正常。但我再次对其进行了测试,现在它抛出了安全异常。面临与this SO 问题完全相同的问题。你能帮忙吗? 您应该打开第二个问题并发布您拥有的代码、您获得的堆栈跟踪以及问题的描述。这将使人们更容易回答,也可以帮助未来的开发人员解决类似的问题。谢谢!

以上是关于从内容 URI 中获取搜索图像的绝对文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何从android pie中的内容uri获取文件路径

从 mediastore 的 URI 获取文件名和路径

Android 文件绝对路径和Content开头的Uri互相转换

如何从 URI 中获取文件路径? [复制]

显示从相机拍摄的图像时,Uri 为空

Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时