【问题标题】:Android: Let user pick image or video from GalleryAndroid:让用户从图库中选择图像或视频
【发布时间】:2011-06-22 18:19:57
【问题描述】:

是否可以以这样的方式启动图库,同时显示图片和视频?

谢谢

【问题讨论】:

标签: android android-intent mime-types


【解决方案1】:

从图库中选择音频文件:

//Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);

从图库中选择视频文件:

//Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);

从图库中选择图片:

//Use  MediaStore.Images.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

选择媒体文件或图片:

 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/* video/*");

【讨论】:

  • 在用户选择媒体文件并调用 OnResult 后,如何判断所选文件是图像还是视频?
  • @Siavash 如果您找到答案,请在此处发布
  • @aravindvarma 我已经发布了答案:)
  • 图像 + 视频在 Android 5.1 上不起作用,它总是显示具有第一个 mime 类型的文件。在这种情况下,图像。有什么想法吗?
  • 谷歌照片应用只采用第一种类型。不工作!
【解决方案2】:

你这样开始画廊:

Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/* video/*");
startActivityForResult(pickIntent, IMAGE_PICKER_SELECT);

然后在您的onActivityResult 中,您可以通过以下方式检查是否选择了视频或图像:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK) {
    Uri selectedMediaUri = data.getData();
    if (selectedMediaUri.toString().contains("image")) {
        //handle image
    } else  if (selectedMediaUri.toString().contains("video")) {
        //handle video
    }
}

【讨论】:

  • 好的,但是你如何在 Intent 中设置 selectedMediaUri?
  • selectedMediaUri.toString().contains("image") 可以代替 images 这个词。
  • @Chip,完成。 @Siavash,为了清楚起见,我们不应该在回调中检查requestCode == IMAGE_PICKER_SELECT 吗?许多实际活动可能在onActivityResult 中处理了一大堆东西。
  • 不适用于 Android 6.0。它只选择第一个过滤器。
  • 并希望谷歌不会更改默认路径命名:)
【解决方案3】:

(编辑:我不再使用它了,我们回到“选择图像”和“选择视频”这两个选项。问题出在一些索尼手机上。所以,下面不是 100% 的解决方案,小心!)

这是我用的:

if (Build.VERSION.SDK_INT < 19) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/* video/*");
    startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.select_picture)), SELECT_GALLERY);
} else {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});
    startActivityForResult(intent, SELECT_GALLERY_KITKAT);
}

这里的关键是intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});

【讨论】:

  • 我使用了你的方法,但我无法使用 MediaStore.Images.Media.DATA 列读取文件路径,不知道我应该在这里使用哪个
  • 由于类型已经用intent.setType("image/*"); 设置,因此是否应该读取intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"video/*"});
  • 不错的解决方案,但不适用于搭载 Android 7 的 Nexus 9,Google 照片应用仅显示图片。在其他测试设备上,它按预期工作。
【解决方案4】:
intent.setType("*/*");

这会为用户提供对话框,但至少适用于 ICS。尚未在其他平台上测试。

【讨论】:

  • 适用于 Android 7 Nougat。
  • 有效,但也会显示一堆其他随机应用,如声音/日历以及视频/照片
【解决方案5】:

当您需要确定返回的内容是什么类型时,可以使用内容解析器获取返回内容的 MIME 类型:

if( data != null) {
    Uri selectedUri = data.getData();   
    String[] columns = { MediaStore.Images.Media.DATA,
                         MediaStore.Images.Media.MIME_TYPE };

    Cursor cursor = getContentResolver().query(selectedUri, columns, null, null, null);
    cursor.moveToFirst();

    int pathColumnIndex     = cursor.getColumnIndex( columns[0] );
    int mimeTypeColumnIndex = cursor.getColumnIndex( columns[1] );

    String contentPath = cursor.getString(pathColumnIndex);
    String mimeType    = cursor.getString(mimeTypeColumnIndex);
    cursor.close();

    if(mimeType.startsWith("image")) {
          //It's an image
    }
    else if(mimeType.startsWith("video")) {
         //It's a video
    }       
}
else {
    // show error or do nothing
}

【讨论】:

    【解决方案6】:

    我的银河标签附带的 CoolIris 可以做到这一点。然而,我的 acer betouch 上的cooliris 不会:S 在我的里程碑上,您无法通过视频网址上​​的选择意图来启动画廊,但是当您在图像网址上启动它时,您可以选择一个视频,它也会返回一个视频网址。

    【讨论】:

      【解决方案7】:

      UPDATE 2021

      终于找到了适用于 Android 9 的解决方案。

      这段代码只打开图片应用,图片和视频都可以选择。我尝试了一堆不同的组合,这个确切的代码可以让它工作。

          libraryIntent.setType("video/*, image/*");
          String[] mimetypes = {"image/*", "video/*"};
          libraryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
      

      【讨论】:

      • 您好,此代码仅允许我选择视频。你能在这里发布你的整个解决方案吗?
      【解决方案8】:

      仍在努力2022 年 1 月

      如果这对你有用,那就试试吧,

      Intent intent = new Intent(Intent.ACTION_PICK, android.provider
                                .MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
          intent.setType("image/* video/*");
          startActivityForResult(intent,PICK_FILE);
      

      对于较旧的 SDK 和某些设备,请尝试以下一种,

       Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
          intent.addCategory(Intent.CATEGORY_OPENABLE);
          intent.setType("image/*");
          intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});
           startActivityForResult(intent,PICK_FILE);
      

      其中,PICK_FILE 是一个变量,

      private static final int PICK_FILE = 1;
      

      【讨论】:

        【解决方案9】:

        您需要使用以下内容作为选择 Intent

        Intent photoLibraryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        photoLibraryIntent.setType("image/* video/*");
        

        【讨论】:

          猜你喜欢
          • 2016-04-02
          • 2011-02-12
          • 2013-03-29
          • 2017-09-21
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          相关资源
          最近更新 更多