当前位置: 首页 > 知识库问答 >
问题:

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

燕飞文
2023-03-14

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

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)

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

谢谢!!

共有1个答案

国仰岳
2023-03-14

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

使用action_get_content在库中选择图像,而不是使用action_pick并指向ImageStore的URI提供程序,其背后的原因是,action_get_content受到很好的支持,而action_pick不受支持。Android框架工程师已经提到过几次了。

我很难学到的。在发现这一点之前,我必须处理各种不一致的地方。

与此有关的注释

您应该始终使用OpenInputStream通过接收到URIContentResolver来获取文件,而不是尝试获取存储文件的实际路径。很可能的情况是,ContentProvider实现是由云服务支持的(Picasa就是这种情况),或者实现细节会随着时间的推移而改变。

Android的内容提供商可以让你抽象数据是如何被访问的。试图找出文件的位置是我看到的一个常见错误。通常建议的是通过查询给定URIdata列来查找位置。根据使用的contentprovider,它可能返回不同的内容,甚至随着时间的推移会随着新版本发生变化。

通过使用openinputstream,您不必关心文件在哪里,只需接收字节流并对其执行您希望的操作。这样你就不会有问题支持其他应用程序的内容提供者,比如Google Drive,Dropbox等,这些应用程序提供了类似的选择器界面来选择图像。

我知道OP使用的是openinputstream,但其他的答案是相反的,这是我经常看到的。

 类似资料:
  • 当一张新照片添加到应用程序的照片“集合”中时,就会调用该方法。当已知是本地图像时(即:如果照片是从应用程序内部拍摄的,或者OnActivityResult的数据参数为空),则本地参数设置为true,我尝试从媒体内容提供商获取content://uri,以便获得有效的图像id传递给Thumbnails.getThumbnail。该代码对于从相机应用程序(通过startActivityForResul

  • 问题内容: 如何在MySQL中插入图像,然后使用PHP检索图像? 我在这两个领域的经验都很有限,我可以使用一些代码让我着手解决这个问题。 问题答案: 首先,您创建一个MySQL表来存储图像,例如: 然后,您可以将图像写入数据库,如下所示: 您可以使用以下方法在网页中显示数据库中的图像:

  • 互联网日安! 我正在尝试从mysql数据库检索并显示一个图像到一个图像视图(android)中。图像是blob类型。我有以下php代码从MySQL获取图像。 下面是使用JSON的android代码。 提前感谢您的帮助!

  • 问题内容: 如何在SQLite中存储和获取图像以及以什么格式保存图像?如果用一个例子来解释会更有用。 问题答案: 图像本身无法存储到数据库列中,但是您可以先将其转换为字符串,然后再存储。该字符串称为base64字符串。据我所知,任何图像都可以转换为相反的图像。 编码为基数64: 现在,您的UIImage对象将转换为String!将strBase64保存到SQLite DB。记住要用作列类型,因为此

  • 最近,我一直试图在Java中缩放像素数组(INT[])。我使用。setrgb()将我所有的像素数据添加到BufferedImage中。然后,BufferedImage提供了一个名为.getScaledInstance()的函数。这对我来说应该很有效,但我遇到了一个问题。.getScaledInstance()返回图像,而不是BufferedImage。对于Image对象,我不能使用.getrgb(

  • 我正在尝试从Google+同步照片的一个文件夹中的gallery应用程序获取图像。选择映像后,Uri将被正确地传回。但是当我试图在存储设备上获取那个图像的实际路径,以便我可以使用它时,它崩溃了。问题似乎特别出在picasa内容提供商身上。 在Nexus S和Nexus 7以及其他设备上进行了测试。 在这里,dat字段似乎正确地传递了Uri,但当我试图获取图像的位置时,它崩溃了,出现以下错误。 Pi