Выберите несколько изображений из галереи Android
так что в основном то, что я пытаюсь достичь, это открыть Gallery в Android и пусть пользователь выбирает multiple images. Теперь этот вопрос был задан часто но я не удовлетворен ответами. В основном потому, что я нашел что-то интересное в De docs в своей IDE (я вернусь к этому позже), и поэтому я не хочу использовать пользовательский адаптер, а только ванильный.
мой код для выбора одного изображения:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
теперь люди на так и другие сайты скажут вам, что у вас есть 2 варианта:
1) Не используйте ACTION_GET_CONTENT но .
этот не работает. Это в соответствии с документами для sending файлы и не retrieving и это именно то, что он делает. При использовании ACTION_SEND_MULTIPLE я получил окно, открытое на моем устройстве, где я должен выбрать приложение для отправки моих данных. Это не то, что я хочу, поэтому мне интересно, как люди добились этого с помощью этого решения.. Скучаю ли я что-то?
2) реализовать custom Gallery. Теперь это мой последний вариант, который я рассмотрю, потому что imho это не то, что я ищу, потому что я должен сам его стилизовать, и почему, черт возьми, вы просто не можете выбрать несколько изображений в галерее vanilla?
должен быть вариант для этого.. Теперь самое интересное, что я нашел это:
я нашел это в описании документов ACTION_GET_CONTENT.
если вызывающий абонент может обрабатывать несколько возвращенных элементов (пользователь выполняет
множественный выбор), то он может указать EXTRA_ALLOW_MULTIPLE
указать это.
это довольно интересно. Здесь они ссылаются на случай использования, где пользователь может выбрать несколько элементов?
позже они говорят в документах:
вы можете использовать EXTRA_ALLOW_MULTIPLE, чтобы позволить пользователю выбрать несколько
предметы.
так что это довольно очевидно, верно? Этот это то, что мне нужно. Но мой следующий вопрос: где я могу поставить этот EXTRA_ALLOW_MULTIPLE? Печально то, что я не могу найти это ни где в разработчиков.руководство андроид а также это не определено как константа в классе INTENT.
кто-нибудь может помочь мне с этим EXTRA_ALLOW_MULTIPLE?
9 ответов:
опция EXTRA_ALLOW_MULTIPLE устанавливается на intent через Intent.putExtra() метод:
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);ваш код должен выглядеть так:
Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);Примечание:
EXTRA_ALLOW_MULTIPLEопция доступна только в Android API 18 и выше.
определите эти переменные в классе:
int PICK_IMAGE_MULTIPLE = 1; String imageEncoded; List<String> imagesEncodedList;предположим, что onClick на кнопке он должен открыть галерею, чтобы выбрать изображения
Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE);затем вы должны переопределить метод onActivityResult
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { try { // When an Image is picked if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK && null != data) { // Get the Image from data String[] filePathColumn = { MediaStore.Images.Media.DATA }; imagesEncodedList = new ArrayList<String>(); if(data.getData()!=null){ Uri mImageUri=data.getData(); // Get the cursor Cursor cursor = getContentResolver().query(mImageUri, filePathColumn, null, null, null); // Move to first row cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imageEncoded = cursor.getString(columnIndex); cursor.close(); } else { if (data.getClipData() != null) { ClipData mClipData = data.getClipData(); ArrayList<Uri> mArrayUri = new ArrayList<Uri>(); for (int i = 0; i < mClipData.getItemCount(); i++) { ClipData.Item item = mClipData.getItemAt(i); Uri uri = item.getUri(); mArrayUri.add(uri); // Get the cursor Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); // Move to first row cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imageEncoded = cursor.getString(columnIndex); imagesEncodedList.add(imageEncoded); cursor.close(); } Log.v("LOG_TAG", "Selected Images" + mArrayUri.size()); } } } else { Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG) .show(); } super.onActivityResult(requestCode, resultCode, data); }ОБРАТИТЕ ВНИМАНИЕ, ЧТО: галерея не дает вам возможность выбрать несколько изображений, поэтому мы здесь открываем all images studio, чтобы вы могли выбрать несколько изображений из них. и не забудьте добавить разрешения для вашего манифест
ОЧЕНЬ ВАЖНО: getData(); чтобы получить одно изображение, и я сохранил его здесь в строке imageEncoded если пользователь выбирает несколько изображений, то они должны храниться в списке
таким образом, вы должны проверить, который является нулевым, чтобы использовать другой
желаю вам иметь хорошую попытку и для других
Я надеюсь, что этот ответ не поздно. Поскольку виджет галерея не поддерживает множественный выбор по умолчанию, но вы можете настроить gridview, который принял ваше намерение множественного выбора. Другой вариант-расширить представление галереи и добавить свой собственный код, чтобы разрешить множественный выбор.
Это простая библиотека может сделать это:https://github.com/luminousman/MultipleImagePickобновление:
Из комментария @ilsy, CustomGalleryActivity в этой библиотеке используйтеmanageQuery, который является устаревшим, поэтому его следует изменить наgetContentResolver().query()иcursor.close()как ответ
многие из этих ответов имеют сходство, но все они упускают самую важную часть, которая находится в
onActivityResult, проверьте, еслиdata.getClipDataравно null до проверкаdata.getDataкод для вызова диалога выбора файла:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); //allows any image file type. Change * to specific extension to limit it //**These following line is the important one! intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURES); //SELECT_PICTURES is simply a global int used to check the calling intent in onActivityResultкода все из выбранных изображений:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == SELECT_PICTURES) { if(resultCode == Activity.RESULT_OK) { if(data.getClipData() != null) { int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop. for(int i = 0; i < count; i++) Uri imageUri = data.getClipData().getItemAt(i).getUri(); //do something with the image (save it to some directory or whatever you need to do with it here) } } else if(data.getData() != null) { String imagePath = data.getData().getPath(); //do something with the image (save it to some directory or whatever you need to do with it here) } } } }обратите внимание, что в Android chooser есть фотографии и Галерея, доступные на некоторых устройствах. Фотографии позволяет выбрать несколько изображений. Галерея позволяет только один разом.
Привет, ниже код работает нормально.
Cursor imagecursor1 = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy + " DESC"); this.imageUrls = new ArrayList<String>(); imageUrls.size(); for (int i = 0; i < imagecursor1.getCount(); i++) { imagecursor1.moveToPosition(i); int dataColumnIndex = imagecursor1 .getColumnIndex(MediaStore.Images.Media.DATA); imageUrls.add(imagecursor1.getString(dataColumnIndex)); } options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.stub_image) .showImageForEmptyUri(R.drawable.image_for_empty_url) .cacheInMemory().cacheOnDisc().build(); imageAdapter = new ImageAdapter(this, imageUrls); gridView = (GridView) findViewById(R.id.PhoneImageGrid); gridView.setAdapter(imageAdapter);вы хотите больше разъяснений. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
У меня тоже была такая же проблема. Я также хотел, чтобы пользователи могли легко снимать фотографии, выбирая фотографии из галереи. Не могу найти родной способ сделать это, поэтому я решил сделать проект с открытым исходным кодом. Это очень похоже на MultipleImagePick, но просто лучший способ его реализации.
https://github.com/giljulio/android-multiple-image-picker
private static final RESULT_CODE_PICKER_IMAGES = 9000; Intent intent = new Intent(this, SmartImagePicker.class); startActivityForResult(intent, RESULT_CODE_PICKER_IMAGES); @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode){ case RESULT_CODE_PICKER_IMAGES: if(resultCode == Activity.RESULT_OK){ Parcelable[] parcelableUris = data.getParcelableArrayExtra(ImagePickerActivity.TAG_IMAGE_URI); //Java doesn't allow array casting, this is a little hack Uri[] uris = new Uri[parcelableUris.length]; System.arraycopy(parcelableUris, 0, uris, 0, parcelableUris.length); //Do something with the uris array } break; default: super.onActivityResult(requestCode, resultCode, data); break; } }
попробуйте это IntentChooser. Просто добавьте несколько строк кода, остальное я сделал за вас.
private void startImageChooserActivity() { Intent intent = ImageChooserMaker.newChooser(MainActivity.this) .add(new ImageChooser(true)) .create("Select Image"); startActivityForResult(intent, REQUEST_IMAGE_CHOOSER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) { List<Uri> imageUris = ImageChooserMaker.getPickMultipleImageResultUris(this, data); } }PS: Как уже упоминалось в ответах выше, EXTRA_ALLOW_MULTIPLE доступен только для API >= 18. И некоторые приложения галереи не делают эту функцию доступной (Google Фото и документы (
com.android.documentsui) работы.
инициализировать экземпляр:
private String imagePath; private List<String> imagePathList;на onActivityResult вы должны написать это, если-еще 2 блока. Для одного изображения, а другой для нескольких изображений.
if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && data != null){ imagePathList = new ArrayList<>(); if(data.getClipData() != null){ int count = data.getClipData().getItemCount(); for (int i=0; i<count; i++){ Uri imageUri = data.getClipData().getItemAt(i).getUri(); getImageFilePath(imageUri); } } else if(data.getData() != null){ Uri imgUri = data.getData(); getImageFilePath(imgUri); } }самая важная часть, получить путь изображения от uri:
public void getImageFilePath(Uri uri) { File file = new File(uri.getPath()); String[] filePath = file.getPath().split(":"); String image_id = filePath[filePath.length - 1]; Cursor cursor = getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null); if (cursor!=null) { cursor.moveToFirst(); imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); imagePathList.add(imagePath); cursor.close(); } }надеюсь, это может помочь вам.
смарт-Android галерея с несколькими действиями выбора изображения.
Проверьте демо на моем блоге
во-первых сделать кнопку для действий и вы можете использовать его для одного или нескольких
для выбора одного изображения: - - световой.ACTION_PICK для выбора одного изображения.
для выбора нескольких изображений: - - световой.ACTION_MULTIPLE_PICK для выбора несколько изображений.
MainActivity.java
// For single image Intent i = new Intent(Action.ACTION_PICK); startActivityForResult(i, 100); // For multiple images Intent i = new Intent(Action.ACTION_MULTIPLE_PICK); startActivityForResult(i, 200); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == Activity.RESULT_OK) { adapter.clear(); viewSwitcher.setDisplayedChild(1); String single_path = data.getStringExtra("single_path"); imageLoader.displayImage("file://" + single_path, imgSinglePick); } else if (requestCode == 200 && resultCode == Activity.RESULT_OK) { String[] all_path = data.getStringArrayExtra("all_path"); ArrayList<CustomGallery> dataT = new ArrayList<CustomGallery>(); for (String string : all_path) { CustomGallery item = new CustomGallery(); item.sdcardPath = string; dataT.add(item); } viewSwitcher.setDisplayedChild(0); adapter.addAll(dataT); } }В AndroidManifest.xml
<activity android:name="CustomGalleryActivity" > <intent-filter> <action android:name="luminous.ACTION_PICK" /> <action android:name="luminous.ACTION_MULTIPLE_PICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

Comments