从内容 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);
我正在尝试使用隐式意图将图像从其他应用程序共享到我的应用程序 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);