【问题标题】:MIME type images/* is showing images and videos bothMIME 类型 images/* 显示图像和视频
【发布时间】:2014-04-21 10:10:59
【问题描述】:

我正在尝试使用 Intent 从 sd 卡中获取图像。 以下是我的代码:

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

当我在三星上运行我的应用程序时,它会显示要选择的图像,但是当我在 Micromax 上运行相同的代码时,它会显示图像和视频。

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

【问题讨论】:

  • 我怀疑这里的任何答案都会有所作为。问题很可能是画廊应用程序或由 Micromax 设备上的Intent 打开的任何应用程序没有正确实现这一点。它应该只显示图像,但制造商搞砸了,现在它也显示视频。它发生的频率比人们想象的要多……
  • 实际上它不是显示视频的图库应用。当我从对话框中选择其他应用程序(如照片)时,我会得到图像和视频。
  • 好吧,您对此无能为力。您使用的代码很好。收到Intent 的应用程序只是没有按应有的方式响应。我不会担心的。只需检查它是否真的是一张已被选中的照片。您永远无法确定其他应用程序做了什么,或者哪个应用程序准确响应了Intent
  • 有什么方法可以在 onActivityResult() 方法中检测到我收到的是视频而不是图像,以便我可以在那里设置一些条件?
  • 最简单的检查是文件扩展名。更复杂一点是检查 mime 类型。有很多解决方案,我认为也有一些好的库来识别文件类型。根据您希望它是一张照片的确定程度,您可以决定要做什么。对于初学者来说,检查文件扩展名应该绰绰有余。 Here is another question that deals with this

标签: android mime-types


【解决方案1】:

我通过检查我收到的文件的扩展名解决了这个问题,如果收到的文件的扩展名是视频文件的扩展名,那么我将向用户显示 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 是的,你说得对。甚至我之前更改了该代码并获取了“。”的最后一个索引。还是谢谢。
【解决方案2】:

将此添加到您的 AndroidManifest.xml

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="image/*" />
</intent-filter>

将意图过滤器添加到您列出的特定活动中。检查这个Google Code

【讨论】:

    【解决方案3】:

    删除

    intent.setAction(Intent.ACTION_GET_CONTENT);
    

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

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

    【讨论】:

      【解决方案4】:

      似乎无法保证使用 images/* 仅返回图像。是否尊重返回的内容取决于其他应用程序。因此,您可以让用户选择他们想要的任何内容,然后通知他们如果它不是图像等。

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

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

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 2011-05-11
        • 2012-02-29
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2022-10-18
        • 2017-03-04
        • 1970-01-01
        相关资源
        最近更新 更多