从内容 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 supportsInputStream
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 文件绝对路径和Content开头的Uri互相转换
Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时