Итак, в основном то, что я пытаюсь достичь, - это открыть Gallery
в Android и позволить пользователю выбирать multiple images
. Сейчас этот вопрос задают часто но я не удовлетворен ответами. В основном потому, что я нашел кое-что интересное в документации в моей среде IDE (я вернусь к этому позже), и поэтому я не хочу использовать специальный адаптер, а только ванильный.
Теперь мой код для выбора одного изображения:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Теперь люди на SO и других сайтах скажут вам, что у вас есть 2 варианта:
1) Не использовать, ACTION_GET_CONTENT
а ACTION_SEND_MULTIPLE
взамен.
Это не работает. Это соответствует документам для sending
файлов, а не, retrieving
и это именно то, что он делает. При использовании ACTION_SEND_MULTIPLE на моем устройстве открылось окно, в котором я должен выбрать приложение для отправки моих данных. Это не то, что я хочу, поэтому мне интересно, как люди добились этого с помощью этого решения .. Я что-то упускаю?
2) Реализуйте custom Gallery
. Теперь это мой последний вариант, который я рассмотрю, потому что imho это не то, что я ищу, потому что я должен сам его стилизовать И почему, черт возьми, вы просто не можете выбрать несколько изображений в ванильной галерее?
Должна быть опция для этого ... Теперь я обнаружил интересную вещь:
я нашел это в описании документации ACTION_GET_CONTENT
.
Если вызывающий может обрабатывать несколько возвращаемых элементов (пользователь выполняет множественный выбор), он может указать EXTRA_ALLOW_MULTIPLE, чтобы указать это.
Это довольно интересно. Здесь они ссылаются на вариант использования, когда пользователь может выбрать несколько элементов?
Позже в документации пишут:
Вы можете использовать EXTRA_ALLOW_MULTIPLE, чтобы позволить пользователю выбирать несколько элементов.
Так что это довольно очевидно, правда? Это то, что мне нужно. Но у меня следующий вопрос: где я могу это поставить EXTRA_ALLOW_MULTIPLE
? Печально то, что я не могу найти это нигде в руководстве developers.android, а также это не определено как константа в классе INTENT.
Кто-нибудь может мне с этим помочь EXTRA_ALLOW_MULTIPLE
?
источник
EXTRA_ALLOW_MULTIPLE
позволяет выбрать несколько элементов. Получите URI, вызвавgetClipData()
возвращенное намерение вonActivityResult
. Единственная проблема в том, что виджет галереи не позволяет множественный выбор. В этом случае щелчок по любому изображению завершит выбор, и вы сможете получить URI (одного элемента), вызвавgetData
возвращенное намерениеОтветы:
Параметр EXTRA_ALLOW_MULTIPLE устанавливается для намерения через метод Intent.putExtra ():
Ваш код выше должен выглядеть так:
Примечание:
EXTRA_ALLOW_MULTIPLE
опция доступна только в Android API 18 и выше.источник
Intent.getClipData
. Он имеет массив ClipData Item.Определите эти переменные в классе:
Предположим, что onClick на кнопке должен открывать галерею для выбора изображений.
Затем вы должны переопределить метод onActivityResult
ПРИМЕЧАНИЕ: галерея не дает вам возможности выбирать несколько изображений, поэтому здесь мы открываем студию всех изображений, в которой вы можете выбрать из них несколько изображений. и не забудьте добавить разрешения в свой манифест
ОЧЕНЬ ВАЖНО: getData (); чтобы получить одно изображение, и я сохранил его здесь, в imageEncoded String, если пользователь выбирает несколько изображений, они должны быть сохранены в списке
Итак, вы должны проверить, какой из них равен нулю, чтобы использовать другой
Желаю вам удачной попытки и другим
источник
Многие из этих ответов имеют сходство, но во всех отсутствует самая важная часть, которая находится
onActivityResult
, проверьте,data.getClipData
является ли значение null перед проверкойdata.getData
Код для вызова средства выбора файла:
Код для выбора всех изображений:
Обратите внимание, что в программе выбора Android на некоторых устройствах доступны фотографии и галерея. Фотографии позволяют выбрать несколько изображений. Галерея позволяет только по одному.
источник
getData()
иногда он НЕ будет иметь значение NULL, а будет иметь только один Uri. Если вы хотите обрабатывать, когда пользователь выбирает несколько файлов, проверьтеgetClipData()
перед этимgetData()
- если данные клипа не равны нулю, пользователь мог выбрать несколько изображений. Обработка getClipData перед getData, но обработка обоих случаев важна для поддержки разных устройств, но при этом позволяет использовать несколько Uris.Надеюсь, ответ еще не поздно. Поскольку виджет галереи не поддерживает множественный выбор по умолчанию, но вы можете настроить сетку, которая принимает ваше намерение множественного выбора. Другой вариант - расширить представление галереи и добавить свой собственный код, чтобы разрешить множественный выбор.
Это может сделать простая библиотека: https://github.com/luminousman/MultipleImagePick
Обновление :
С @ ilsy замечания, CustomGalleryActivity в этой библиотеке использовании
manageQuery
, который является устаревшим, поэтому оно должно быть измененоgetContentResolver().query()
иcursor.close()
как этот ответисточник
getContentResolver().query()
в потоке пользовательского интерфейса. Прочтите о загрузчиках и библиотеке поддержки..cacheOnDisc()
также устарел, поэтому измените его на.cacheOnDisc(true)
с логическим параметромИнициализировать экземпляр:
В onActivityResult вы должны написать этот блок If-else 2. Один для одного изображения, другой для нескольких изображений.
Самая важная часть, получить путь к изображению из uri :
Надеюсь, это поможет тебе.
источник
Я получил null из
Cursor
. Затем нашел решение преобразоватьUri
в,Bitmap
которое отлично работает.Вот решение, которое мне подходит:
источник
Привет, код ниже работает нормально.
Вы хотите больше разъяснений. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
источник
У меня тоже была такая же проблема. Я также хотел, чтобы пользователи могли легко фотографировать, выбирая фотографии из галереи. Не удалось найти собственный способ сделать это, поэтому я решил создать проект с открытым исходным кодом. Это очень похоже на MultipleImagePick, но просто лучший способ его реализации.
https://github.com/giljulio/android-multiple-image-picker
источник
Попробуйте этот IntentChooser . Просто добавьте несколько строк кода, все остальное я сделал за вас.
PS: как упоминалось в ответах выше, EXTRA_ALLOW_MULTIPLE доступен только для API> = 18. И некоторые приложения галереи не делают эту функцию доступной (Google Фото и Документы (
com.android.documentsui
) работают.источник
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);