Выбор нескольких изображений из каталога изображений Android [duplicate]

Вы можете включить полную отчетность об ошибках (включая уведомления и строгие сообщения). Некоторые люди считают это слишком многословным, но это стоит попробовать. Установите error_reporting на E_ALL | E_STRICT в вашем php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT уведомит вас об устаревших функциях и даст вам рекомендации о лучших методах выполнения определенных задач.

Если вы не хотите получать уведомления, но вы найдете другие типы сообщений полезными, попробуйте исключить уведомления:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Также убедитесь, что display_errors включен в php.ini. Если ваша версия PHP старше 5.2.4, установите ее в On:

display_errors = "On"

Если ваша версия 5.2.4 или новее, используйте:

display_errors = "stderr"
81
задан Jitesh Dalsaniya 25 October 2013 в 10:31
поделиться

9 ответов

Параметр EXTRA_ALLOW_MULTIPLE установлен в намерении с помощью метода 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 и выше.

72
ответ дан W4R10CK 21 August 2018 в 02:28
поделиться
  • 1
    Я не могу выбрать несколько изображений, используя EXTRA_ALLOW_MULTIPLE. Пожалуйста, помогите мне, я запускаю приложение в 18+ ​​api. – Cheerag 19 June 2014 в 13:22
  • 2
    @Cheerag это не позволит вам выбрать несколько файлов, я не знаю, как все это согласилось. – dharam 26 June 2014 в 15:08
  • 3
    Выбор нескольких изображений. но как получить URL-адрес изображения от результата Activity ???? – John 22 March 2015 в 16:40
  • 4
    Это запускает сборщик изображений и позволяет выбирать несколько изображений, но я не знаю, как получить URL-адреса в onActivityResult. – Tom Kincaid 26 August 2015 в 19:16
  • 5
    @TomKincaid .... я также сталкивается с такой же проблемой. Я не могу получить uri из нескольких изображений – GvSharma 29 January 2016 в 05:10

Надеюсь, этот ответ не задержится. Поскольку виджет галереи не поддерживает множественный выбор по умолчанию, но вы можете настроить gridview, который принял ваш многозадачный замысел. Другой вариант - расширить вид галереи и добавить свой собственный код, чтобы разрешить множественный выбор. Это простая библиотека может это сделать: https://github.com/luminousman/MultipleImagePick

Обновление: из комментария @ ilsy, ​​ CustomGalleryActivity в эта библиотека использует manageQuery, которая устарела, поэтому ее следует изменить на getContentResolver().query() и cursor.close(), например этот ответ

20
ответ дан Community 21 August 2018 в 02:28
поделиться
  • 1
    Никогда не поздно ответить на вопрос; ты помог мне! – Bart Burg 13 February 2014 в 10:31
  • 2
    будьте осторожны, потому что код библиотеки не очень хорош. – mbelsky 20 January 2015 в 01:17
  • 3
    @ilsy хорошо, если вы упомянете managedQuery, лишен, я обновил свой ответ. Если, пожалуйста, не указывайте на проблему, чтобы все это знали. Но это не значит, что эта библиотека не очень хорошая. Это библиотека с открытым исходным кодом, и вы можете ее настраивать по своему усмотрению. – R4j 20 January 2015 в 03:27
  • 4
    @ R4j Да и я писал об этом: библиотека не готова к использованию в проектах. Нужно много обновлений, чтобы начать использовать его. И о вашем обновлении: не используйте getContentResolver().query() в потоке пользовательского интерфейса. Читайте о загрузчиках и библиотеке поддержки. – mbelsky 20 January 2015 в 06:59
  • 5
    .cacheOnDisc() также устарел, поэтому измените его на .cacheOnDisc(true) с помощью булева параметра – Pratik Butani 6 June 2015 в 12:10

У меня тоже была такая же проблема. Я также хотел, чтобы пользователи могли легко фотографировать фотографии при сборке фотографий из галереи. Не удалось найти собственный способ сделать это, поэтому я решил создать проект с открытым исходным кодом. Это похоже на 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;
    }
}
0
ответ дан Gil Julio 21 August 2018 в 02:28
поделиться

Инициализировать экземпляр:

private String imagePath;
private List<String> imagePathList;

В onActivityResult. Вы должны записать этот блок If-else 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);
    }
}

Наиболее важная часть, Get Image Path из 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();
    }
}

Надеюсь, это может вам помочь.

0
ответ дан Hasib Akter 21 August 2018 в 02:28
поделиться

Многие из этих ответов имеют сходство, но все они не имеют самой важной части, которая находится в onActivityResult, проверьте, что data.getClipData имеет значение null перед проверкой data.getData

Код для вызова файла chooser:

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-устройстве Android есть фотографии и галерея, доступные на некоторых устройствах. Фотографии позволяют выбирать несколько изображений. Галерея позволяет только по одному.

8
ответ дан Mira_Cole 21 August 2018 в 02:28
поделиться

Привет, ниже код работает нормально.

 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

0
ответ дан Ramesh Thangaraj 21 August 2018 в 02:28
поделиться
  • 1
    Код не может быть точным, потому что managedQuery устарел – mbelsky 20 January 2015 в 01:14
  • 2
    если он работает, все в порядке. Хорошо указывать устаревший код, но до тех пор, пока вы используете его без каких-либо проблем, его штраф в использовании. Важно знать, почему его устарело, будь то проблемы безопасности, более новый код более эффективен и т. Д. Но так как приложения для Android являются передовыми, то устаревший код по-прежнему будет работать в будущем. – JStephen 26 January 2015 в 18:47

Определите эти переменные в классе:

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);
}

ЗАМЕЧАНИЕ. Галерея не дает вам возможности выбора мульти изображений, поэтому мы здесь открываем студию всех изображений, чтобы вы могли выбирать из них несколько изображений. и не забудьте добавить права на ваш манифест

ОЧЕНЬ ВАЖНО: getData (); чтобы получить одно единственное изображение, и я сохранил его здесь в imageEncoded String, если пользователь выбирает мульти-изображения, тогда они должны быть сохранены в списке

. Таким образом, вы должны проверить, что является нулевым, чтобы использовать другое

Желаю вам приятной попытки и другим

47
ответ дан TofferJ 21 August 2018 в 02:28
поделиться
  • 1
    Я пропустил & quot; target.setType (& quot; image / * & quot;); & quot; и он отправляет пользователей непосредственно на Фото, а не дает пользователю возможность перейти в Галерею, которая не позволяет выбирать несколько фотографий. Не уверен, что из-за этого мой getData () никогда не возвращает null, поэтому я закончил использование getClipData исключительно для одиночного и множественного выбора изображения. – Johnny Wu 6 March 2016 в 15:38
  • 2
    просто используйте часть data.getClipData () достаточно, нет необходимости проверять data.getData () – truongnm 8 May 2016 в 07:09
  • 3
    Uri uri = content: //com.android.providers.media.documents/document/image%3A772 uri имеет данные, но cursor.getString возвращает null для меня imageEncoded = cursor.getString (columnIndex); – Muhammad Zubair Ashraf 7 December 2016 в 11:58
  • 4
    Это было полезно, но я должен был дополнить эти функции для getPath: stackoverflow.com/a/20559175/6141959 – Geynen 7 April 2017 в 23:48
  • 5
    Я получаю imageEncoded = null – CGR 29 June 2017 в 16:39

Попробуйте этот 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 Photos and Documents (com.android.documentsui) работа.

0
ответ дан Tuan Chau 21 August 2018 в 02:28
поделиться
  • 1
    Не позволяя мне выбирать несколько изображений, хотя добавлено intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); – Scorpion 22 March 2017 в 17:28

Умная галерея Android с несколькими действиями по выбору изображения.

Проверьте демонстрацию в моем блоге

Сначала сделайте кнопку для действия, и вы можете использовать ее для single / multiple

Для выбора одиночного изображения : - - luminous.ACTION_PICK для выбора одного изображения.

Для выбора нескольких изображений : - - luminous.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>
-1
ответ дан Zoe 21 August 2018 в 02:28
поделиться
  • 1
    Я получил исключение нулевого указателя из ... data.getStringExtra (& quot; all_path & quot;); – Johnny Wu 6 March 2016 в 03:30
Другие вопросы по тегам:

Похожие вопросы: