繁体   English   中英

从Gallery中检索非缓存的Picasa图像。 3.0和4.0

[英]Retrieve a non cached Picasa image from Gallery. 3.0 and 4.0

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

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方法中的意图包含类似于Uri的...

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

但是当你选择一个picasa图像时,uri就像......

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

我读了很多关于这个问题的文章,我尝试了很多解决方法。

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

getContentprovider().openInputStream(uri)

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

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

谢谢!!

正确的解决方案是使用ACTION_GET_CONTENT 它的名字可能听起来不像ACTION_PICK那么直观,但它应该用于你想要做的事情。

使用ACTION_GET_CONTENT选择图库中的图像而不是使用ACTION_PICK并指向ACTION_GET_CONTENT的URI提供程序的原因是ACTION_GET_CONTENT得到了很好的支持 ,而ACTION_PICK没有 Android Framework工程师已经多次提到它。

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


与此相关的说明

您应始终使用openInputStream通过带有URIContentResolver获取文件,而不是尝试获取存储文件的实际路径。 很可能是ContentProvider实现由云服务支持(Picasa就是这种情况),或者实现细节随时间而变化。

Android的内容提供商允许您抽象数据的访问方式。 试图找出文件所在的位置是我看到的常见错误。 通常建议的是通过查询给定URIDATA列来查找位置。 根据使用的ContentProvider它可能返回不同的东西,甚至随着时间的推移随新版本而变化。

通过使用openInputStream您不必关心文件的位置,您只需接收字节流并按照您的意愿执行操作。 这样,您就不会遇到支持来自Google Drive,Dropbox等其他应用程序的内容提供商的问题,这些应用程序提供类似的选择器界面来选择图像。

我知道OP正在使用openInputStream ,但是其他的答案是建议的,这是我经常看到的。

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

将一些映射应用于内容提供商uri ...

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

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

item => photoid name ?? ALBUMID?

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

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

API要求

名称albumID photoID

姓名我想你可以通过电话从帐户中获取。 AlbumID很棘手,因为内容提供商中的/ item / node值不是可以使用关系来推断它所在的专辑的GUID。我不认为..在picasa中的AFAIK,你需要用户,专辑,照片元组获取对照片条目的引用,照片条目具有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属于albumid 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”:

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

我使用上面的值制作照片图像请求,我有图像。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM