[英]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
通过带有URI
的ContentResolver
获取文件,而不是尝试获取存储文件的实际路径。 很可能是ContentProvider
实现由云服务支持(Picasa就是这种情况),或者实现细节随时间而变化。
Android的内容提供商允许您抽象数据的访问方式。 试图找出文件所在的位置是我看到的常见错误。 通常建议的是通过查询给定URI
的DATA
列来查找位置。 根据使用的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的二进制流。
有关从picasa api获取所需图像的更多详细信息,请参阅上述链接中的已接受答案。
在示例中使用我自己的内容URI之一...
内容://com.google.android.gallery3d.provider/picasa/item/5703943700733980450
在缓存中不可用,那么如何获取图像?
好吧,帐户上的名字是'rowntreerob',我知道photoid 5703943700733980450属于albumid 5703943611411433905。
所以,我为这个条目提出了api请求
并检查文本值的响应
“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.