10

我的应用程序正在调用画廊,其意图如下所示:

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

在版本 < 3.0 中没有问题。

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

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

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

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

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

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

getContentprovider().openInputStream(uri)

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

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

谢谢!!

4

2 回答 2

7

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

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

我很难学会。在发现这一点之前,我不得不处理各种不一致。


与此相关的注释

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

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

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

我知道 OP 正在使用openInputStream,但其他答案却提出了不同的建议,这是我经常看到的东西。

于 2014-08-03T23:29:50.720 回答
2

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

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

内容://com.google.android.gallery3d.provider/picasa/item/5703943700733980450

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

项目=>照片名称??白蛋白??

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

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

API 要求

姓名 相册ID photoID

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

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

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

php picasa api 显示大图

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

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

内容://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 的提供者实例。

于 2012-08-05T02:34:06.797 回答