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,我无法获取图像:_(
谢谢!!
解决方法
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,但是其他的答案却暗示了它,这是我经常看到的.