微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,但是其他的答案却暗示了它,这是我经常看到的.

原文地址:https://www.jb51.cc/android/311654.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐