Android: разрешить пользователю выбирать изображение или видео из галереи

Можно ли запустить галерею таким образом, чтобы показывались и картинки, и видео?

Спасибо


person Asahi    schedule 07.02.2011    source источник
comment
Поздний ответ.... Попробуйте это один раз stackoverflow.com/a/43385723/7634226   -  person Ramaraju    schedule 13.04.2017
comment
Поскольку Google Фото не понимает более одного типа намерения, попробуйте следующее решение: stackoverflow.com/a/44336740/3734116   -  person luckyhandler    schedule 12.11.2019


Ответы (8)


Вы запускаете галерею как таковую:

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
    }
}
person Siavash    schedule 03.12.2014
comment
Хорошо, но как установить selectedMediaUri в намерении? - person Lion789; 02.05.2015
comment
selectedMediaUri.toString().contains("image") будет работать вместо этого слова images. - person coderpc; 08.06.2017
comment
@Чип, готово. @Siavash, не следует ли нам для ясности проверить requestCode == IMAGE_PICKER_SELECT в обратном вызове? многие практические действия могут иметь целую кучу вещей, обработанных в onActivityResult. - person Cee McSharpface; 05.08.2017
comment
Не работает на андроиде 6.0. Он выбирает только первый фильтр. - person Faizan Mubasher; 06.09.2017
comment
и надеюсь, что Google не изменит это имя пути по умолчанию :) - person muaz; 10.10.2020

Выберите аудиофайл из галереи:

//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/*");
person Jorgesys    schedule 08.04.2014
comment
после того, как пользователь выбирает медиафайл и вызывается OnResult, как я могу определить, был ли выбранный файл изображением или видео? - person Siavash; 06.10.2014
comment
@Siavash Если вы нашли ответ, напишите здесь - person aravind varma; 03.12.2014
comment
@aravindvarma я отправил ответ :) - person Siavash; 04.12.2014
comment
Изображения + видео не работают на Android 5.1, всегда отображаются файлы с первым типом mime. В данном случае изображения. Есть идеи? - person shelll; 09.11.2015
comment
Приложение Google Photos использует только первый тип. Не работает! - person Greg Ennis; 01.04.2016
comment
@ShivamPokhriyal есть два решения: 1) две кнопки, одна для изображений, вторая для видео 2) создать собственное средство выбора - person shelll; 20.12.2018

(РЕДАКТИРОВАТЬ: я больше не использую его, мы вернулись к двум вариантам "выбрать изображение" и "выбрать видео". Проблема была с одним телефоном Sony. Так что это не 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/*"});

person Fen1kz    schedule 19.04.2016
comment
Я использовал ваш метод, он работает, но я не могу прочитать путь к файлу, используя столбец MediaStore.Images.Media.DATA, любая идея, которую я должен использовать здесь для этого - person Nouman Tahir; 11.04.2017
comment
Должно ли это читаться как intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"video/*"});, поскольку тип уже был установлен с помощью intent.setType("image/*");? - person samis; 17.04.2017
comment
Хорошее решение, но не работает на Nexus 9 с Android 7, приложение Google для фотографий показывает только картинки. На других тестовых устройствах все работало как положено. - person Nantoka; 11.10.2019

intent.setType("*/*");

Это представляет пользователю диалог, но работает по крайней мере на ICS. На других платформах не тестировал.

person Maurycy    schedule 07.06.2012
comment
Работает на Android 7 Nougat. - person coderpc; 08.06.2017
comment
работает, но также будет отображать кучу других случайных приложений, таких как звук/календарь, вместе с видео/фото - person Gabriel Petersson; 28.01.2021

Когда вам нужно определить, какой тип содержимого был возвращен, вы можете сделать это с помощью преобразователя содержимого, чтобы получить 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
}
person Pit0r    schedule 02.10.2015

CoolIris, поставляемый с моим планшетом Galaxy, может это сделать. Однако Cooliris на моем acer betouch не будет: S На моем этапе вы не можете запустить галерею, указав намерение выбрать URL-адрес видео, однако, когда вы запускаете ее по URL-адресу изображения, вы можете выбрать видео, и он вернет URL-адрес видео слишком.

person arnodenhond    schedule 27.10.2011

Вам нужно использовать следующее как выбор Intent

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

UPDATE 2021

НАКОНЕЦ-ТО решение работает для Android 9.

Этот фрагмент кода открывает только приложения с изображениями, и вы можете выбрать как изображения, так и видео. Я пробовал кучу разных комбинаций, и этот точный код заставит его работать.

    libraryIntent.setType("video/*, image/*");
    String[] mimetypes = {"image/*", "video/*"};
    libraryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
person Gabriel Petersson    schedule 27.01.2021
comment
Здравствуйте, этот код позволяет мне выбирать только видео. Можете ли вы опубликовать свое решение здесь? - person Shafayat Mamun; 12.02.2021