【问题标题】:Retrieve a non cached Picasa image from Gallery. 3.0 and 4.0从图库中检索未缓存的 Picasa 图像。 3.0 和 4.0
【发布时间】:2026-01-20 05:00:01
【问题描述】:

我的应用调用图库的意图如下:

Intent intent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, SELECT_IMAGE_FROM_GALLERY);

在 3.0 及更高版本中,当您获取本地图像时,onActivityResult 方法中的 Intent 包含 Uri like...

content://media/external/images/media/XXX

但是当您选择 picasa 图片时,uri 类似于...

content://com.google.android.gallery3d.provider/picasa/item/XXXXXXXXXXXXXXXXXXXXX

我阅读了很多关于该问题的信息,并尝试了许多解决方法。

目前,我可以使用以下方法获取刚刚缓存的图像:

getContentprovider().openInputStream(uri)

问题是,当图像没有被缓存时,openInputStream(uri) 方法会抛出 FileNotFoundException,我无法获取图像:_ (

任何人都知道如何获取文件或下载文件的网址或获取图像的东西吗??

谢谢!!

【问题讨论】:

  • 最后以一个经典的解决方案结束……通过使用Document.util,它涵盖了所有权限:- *.com/a/30453641/1384010

标签: android gallery android-3.0-honeycomb android-4.0-ice-cream-sandwich picasa


【解决方案1】:

正确的解决方案是使用ACTION_GET_CONTENT。它的名字听起来可能不像 ACTION_PICK 那样直观,但它是您应该使用的名称。

使用ACTION_GET_CONTENT 在您的图库中选择图像而不是使用ACTION_PICK 并指向ImageStore 的URI 提供程序的原因是ACTION_GET_CONTENT 得到很好的支持,而ACTION_PICK不是。 Android 框架工程师曾多次mentioned

我学得很辛苦。在发现这一点之前,我必须处理各种不一致。


与此相关的注释

您应该始终使用openInputStream 通过ContentResolver 获取文件,并收到URI,而不是尝试获取存储文件的真实路径。 ContentProvider 实现很可能是由云服务支持的(Picasa 就是这种情况),或者实现细节会随着时间而改变。

Android 的内容提供程序让您可以抽象出数据的访问方式。试图找出文件所在的位置是我看到的一个常见错误。通常建议是通过查询给定URIDATA 列来查找位置。根据使用的ContentProvider,它可能会返回不同的内容,甚至会随着新版本的出现而变化。

通过使用openInputStream,您不必关心文件在哪里,您只需接收字节流并按照您的意愿使用它。这样,您就不会遇到支持来自其他应用(如 Google Drive、Dropbox 等)的内容提供者的问题,这些应用提供类似的选择器界面来选择图像。

我知道 OP 正在使用 openInputStream,但其他答案却暗示并非如此,这是我经常看到的东西。

【讨论】:

    【解决方案2】:

    另一种获取图片比特流的方法是通过 picasa api....

    将一些映射应用到内容提供者 uri ...

    content://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

    可以将其映射到 picasa api,如下所示:

    item=>photoid 姓名?? 白蛋白??

    picasaweb.google.com/data/entry/api/user/$NAME/albumid/nnnn/photoid/nnnn

    以上是照片条目的 api 请求 - 有关详细信息,请参阅 picasa 文档。

    API 要求

    名称 专辑ID 照片身份证

    名字我想你可以从手机上的帐户中获得。 AlbumID 很棘手,因为内容提供程序中的 /item/ 节点值不是可以使用关系来推断其所在专辑的 GUID。我不认为.. picasa 中的 AFAIK ,您需要 user,album,photo tuple 以获取对照片条目的引用,并且照片条目在 API 元素中具有大照片的 URL:

    “媒体$组”:{ “媒体$内容”:[ {“网址”:

    如果相册的可见性是公开的,您可以获取 url 属性的文本值并使用 http(s) 请求它。响应是 JPG 的二进制流。

    php picasa api show large image

    有关从 picasa api 获取所需图像的更多详细信息,请参阅上述链接中接受的答案。

    在示例中使用我自己的内容 URI 之一...

    content://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

    在缓存中不可用,如何获取图像?

    帐户上的名称是“rowntreerob”,并且 我知道 photoid 5703943700733980450 属于白蛋白 5703943611411433905。

    所以,我对条目进行了 api 请求

    https://picasaweb.google.com//data/entry/api/user/rowntreerob/albumid/5682316071017984417/photoid/5682316083381958690?fields=media%3Agroup%2Fmedia%3Athumbnail%5B%40url%5D%2Cmedia%3Agroup%2Fmedia%3Acontent%5B%40url%5D&alt=json

    并检查

    的文本值的响应

    "media$group":{ "media$content":[ {"url":

    值=https://lh3.googleusercontent.com/-_FFMNGPU1TQ/TtukXyN4eCI/AAAAAAAACso/EzPmut2iKVQ/DSC01612.JPG

    我使用上面的值发出照片图像请求并且我有图像。


    Gallery 3D 应用程序还具有您可以分叉的代码,因为无论它在哪个缩略图列表中检测到“触摸”,它都会委托 contentProvider 接口“获取”BMP。我相信这个接口封装了上面提到的所有血淋淋的实现。通过要求 ContentProvider 生成 BMP,开发者不必担心实现的味道??在 thumbtouch 上,Gallery3d 可能只要求提供者返回 BMP 及其负责解析缓存的各种状态以及是否需要网络调用来返回 BMP 的提供者实例。

    【讨论】:

    • 是的...bc 这应该是我们作为开发人员的工作来做所有这些大声笑。我想不是 。这是谷歌搞砸了,不是开发人员