Android:让用户从图库中选择图片或视频

Asa*_*ahi 35 android android-intent mime-types

是否可以以这种方式启动Gallery,以便显示图片和视频?

谢谢

Jor*_*sys 51

从图库中选择音频文件:

//Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
Run Code Online (Sandbox Code Playgroud)

从图库中选择视频文件:

//Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
Run Code Online (Sandbox Code Playgroud)

从图库中选择图片:

//Use  MediaStore.Images.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Run Code Online (Sandbox Code Playgroud)

选择媒体文件或图像:

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

  • 在用户选择媒体文件并调用OnResult之后,如何判断所选文件是图像还是视频? (7认同)
  • 谷歌照片应用程序只采取第一种类型.不行! (5认同)
  • 图像+视频在Android 5.1上不起作用,它始终显示具有第一个mime类型的文件.在这种情况下的图像.有任何想法吗? (4认同)

Sia*_*ash 39

你这样开始画廊:

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

然后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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在Android 6.0上不起作用.它只选择第一个过滤器. (7认同)
  • `selectedMediaUri.toString().contains("image")`将代替那个单词`images`. (2认同)

Fen*_*1kz 20

(编辑:我不再使用它了,我们回到两个选择"选择图像"和"选择视频".问题出在一些索尼手机上.所以,它不是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);
}
Run Code Online (Sandbox Code Playgroud)

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


Mau*_*ycy 9

intent.setType("*/*");
Run Code Online (Sandbox Code Playgroud)

这为用户提供了对话框,但至少可以在ICS上工作.尚未在其他平台上测试过.


小智 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
}
Run Code Online (Sandbox Code Playgroud)