android – 从Gallery中检索非缓存的Picasa图像. 3.0和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 like …

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

但是当您选择一个picasa图像时,uri就像…

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

我读了很多关于这个问题,我尝试了许多解决方法.

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

getContentprovider().openInputStream(uri)

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

任何人知道如何获取文件或url下载文件或某事来获取图像?

谢谢!!

解决方法

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

ACTION_GET_CONTENT使用ACTION_GET_CONTENT选择图片而不是使用ACTION_PICK并指向ImageStore的URI提供者的原因是ACTION_GET_CONTENT得到很好的支持,而ACTION_PICK则不是. Android Framework工程师已经有mentioned几次了.

我学到了很难的方法.在找出这个之前,我不得不处理各种不一致之处.

与此相关的注释

您应该始终使用openInputStream通过ContentResolver获取文件,而不是尝试获取存储该文件的真实路径,而不使用URI.可能情况下,ContentProvider实现由云服务支持(Picasa的情况),或实现细节随时间而变化.

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

通过使用openInputStream,您不必关心文件的位置,您只需接收字节流,并执行所需的操作.这样一来,您就不会在其他应用程序(如Google Drive,DropBox等)中支持内容提供商,从而提供类似的选择界面来选择图像.

我知道OP正在使用openInputStream,但是其他的答案却暗示了它,这是我经常看到的.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...