MIME类型images/*显示图片和视频

6

我正在尝试使用Intent从SD卡获取图像。

以下是我的代码:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);

当我在三星手机上运行我的应用时,它会显示图片供选择,但是当我在微米克斯手机上运行相同的代码时,它不仅显示图片还显示视频。

我只想选择图片。我该如何解决这个问题?


我怀疑这里的任何答案都不会有所改变。问题很可能是Gallery应用程序或由Micromax设备上的Intent打开的任何应用程序没有正确实现此功能。它应该只显示图像,但制造商搞砸了,现在它也显示视频。这种情况比人们想象的要频繁发生... - Xaver Kapeller
实际上,显示视频的不是相册应用程序。当我从对话框中选择其他应用程序(如照片)时,我会得到图像和视频。 - Nitesh Kumar
好吧,你无能为力。你使用的代码很好。只是接收“Intent”的应用程序没有像他们应该做的那样响应。我不会担心它。只需实现一个检查,以确保选择的是否真的是照片。你永远无法确定其他应用程序会做什么或哪个应用程序会响应“Intent”。 - Xaver Kapeller
有没有办法在onActivityResult()方法中检测到我收到的是视频而不是图片,以便我可以在那里设置一些条件? - Nitesh Kumar
最简单的检查方法是文件扩展名。稍微复杂一些的是检查MIME类型。有很多解决方案,我认为也有一些好的库可以识别文件类型。根据你想要确定它是照片的程度,你可以决定你想做什么。对于初学者来说,检查文件扩展名应该足够了。这里有另一个处理此问题的问题 - Xaver Kapeller
4个回答

2

我通过检查接收到的文件的扩展名来解决了这个问题,如果接收到的文件扩展名是视频文件的扩展名,那么我会向用户显示一个Toast提示只选择照片。

下面是我用来获取文件扩展名的方法:

public static String getImageExtensionFromPath(String imagePath) {
    String[] imageNameArray = imagePath.split("/");
    String imageName = imageNameArray[imageNameArray.length - 1];
    String[] imageArray = imageName.split("\\.");
    String finalImageName = imageArray[1];
    return finalImageName;
}

这种方法无法处理像“this.is.my.photo.jpg”这样的文件名。最好使用以下代码:public static String getExtensionFromPath(String imagePath) { return imagePath.substring((imagePath.lastIndexOf(".") + 1), imagePath.length()); } - suomi35
@suomi35 是的,你说得对。我之前已经更改了那段代码,并取了最后一个 "." 的索引。无论如何还是谢谢你。 - Nitesh Kumar

1
在你的 AndroidManifest.xml 中添加这个。
<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="image/*" />
</intent-filter>

将intent-filter添加到您特定列出的活动中。请参考此处的Google Code

0

使用 images/* 没有保证只返回图像的方法。其他应用程序是否遵守返回的内容取决于它们自己。因此,您可以让用户选择任何他们想要的,然后在不是图像时通知他们。

我在从意图获取 URI 后使用以下方法来检测它是否包含真正的图像,因为即使文件名包含多个点(this.is.my.file.txt),它也能正常工作:

public static String getExtensionFromPath(String imagePath) { return imagePath.substring((imagePath.lastIndexOf(".") + 1), imagePath.length()); }


-1

移除

intent.setAction(Intent.ACTION_GET_CONTENT);

通过以下代码初始化意图对象。

intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接