【问题标题】:Getting the Absolute File Path from Content URI for searched images从内容 URI 中获取搜索图像的绝对文件路径
【发布时间】: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 吗?

【问题讨论】:

    标签: android android-intent uri filepath android-fileprovider


    【解决方案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 问题完全相同的问题。你能帮忙吗?
    • 您应该打开第二个问题并发布您拥有的代码、您获得的堆栈跟踪以及问题的描述。这将使人们更容易回答,也可以帮助未来的开发人员解决类似的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    相关资源
    最近更新 更多