Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42

Как ограничить количество фотографий, выбираемых из галереи?

22.11.2017, 12:41. Показов 4173. Ответов 7

Студворк — интернет-сервис помощи студентам
Реализовать выбор фотографий от 1 до 5 из галереи.
От одной - нюанс понятен, код ниже.
А вот как ограничить, чтобы не больше 5?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
        btnChoice.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                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 - 5"), PICK_IMAGE_MULTIPLE);
            }
        });
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
    {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
 
        switch(requestCode)
        {
            case PICK_IMAGE_MULTIPLE:
                if(resultCode == RESULT_OK)
                {
                    con.newImagesPathsList();//create new List for paths
 
                    int numberOfImages;
 
                    //тут нуллпоинтер .getItemCount(), когда выбираешь 1 штук
 
                    ClipData clipData = imageReturnedIntent.getClipData();
 
                    if (clipData == null) //choiced 1 file
                    {
                        Uri uri = imageReturnedIntent.getData();
                        con.getImagesPaths().add(con.getPath(getActivity(), uri));
                    }
                    else {
 
                        numberOfImages = imageReturnedIntent.getClipData().getItemCount();
 
                        Log.d("numberOfImages = ", numberOfImages + "");
 
 
                        for (int i = 0; i < numberOfImages; i++) {
                            try {
                                Uri tempUri = imageReturnedIntent.getClipData().getItemAt(i).getUri();
 
                                con.getImagesPaths().add(con.getPath(getActivity(), tempUri));
 
                                Log.d("con.getImagesPaths() = ", con.getImagesPaths().get(i));//OK
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2017, 12:41
Ответы с готовыми решениями:

Android получение фотографий из галереи
Все привет! Необходимо реализовать получение масса всех фотографий из галерей + камеры. получать нужно пути к фотографиям и потом...

Ограничение на количество выбираемых записей
SELECT Detals.strName, Detals.strIndication, Contract.Id, strNumber, strDev, strTest, strConf, iDetals, strCustomer, isFinish,...

Как задать количество фотографий в строке?
здравствуйте всем! Хочу спросить есть фотографии при выводе надо что бы выводились они по 4 в строке, а сейчас они у меня в столбик все...

7
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
23.11.2017, 14:21
Предполагаю что можно поставить счетчик и передать

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int ClickCounter=0;
        btnChoice.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                ClickCounter++;
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                intent.putExtra("counter", ClickCounter);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Picture: 1 - 5"), PICK_IMAGE_MULTIPLE);
            }
        });
А в отправлять RESULT_OK, RESULT_CANCELED и RESULT_FIRST_USER если количество зашкаливает.

Добавить обработку RESULT_FIRST_USER


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
    {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
 
        switch(requestCode)
        {
            case PICK_IMAGE_MULTIPLE:
                if(resultCode == RESULT_OK)
                {
                    con.newImagesPathsList();//create new List for paths
 
                    int numberOfImages;
 
                    //тут нуллпоинтер .getItemCount(), когда выбираешь 1 штук
 
                    ClipData clipData = imageReturnedIntent.getClipData();
 
                    if (clipData == null) //choiced 1 file
                    {
                        Uri uri = imageReturnedIntent.getData();
                        con.getImagesPaths().add(con.getPath(getActivity(), uri));
                    }
                    else if (resultCode == FIRST_USER){
// Тут выводим старое - то есть уже то что было набрано юзером в коллекцию до этого. Возможно с сообщением, и прочим.
                    } else {
 
                        numberOfImages = imageReturnedIntent.getClipData().getItemCount();
 
                        Log.d("numberOfImages = ", numberOfImages + "");
 
 
                        for (int i = 0; i < numberOfImages; i++) {
                            try {
                                Uri tempUri = imageReturnedIntent.getClipData().getItemAt(i).getUri();
 
                                con.getImagesPaths().add(con.getPath(getActivity(), tempUri));
 
                                Log.d("con.getImagesPaths() = ", con.getImagesPaths().get(i));//OK
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }
Добавлено через 6 минут
tтот же счетчик можно всунуть в esultCode == RESULT_OK вместо того что я показал в onActivityResult
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(resultCode == RESULT_OK)
                {
                    con.newImagesPathsList();//create new List for paths
 
                    int numberOfImages;
 
                    //тут нуллпоинтер .getItemCount(), когда выбираешь 1 штук
 
                    ClipData clipData = imageReturnedIntent.getClipData();
 
                    if (clipData == null) //choiced 1 file
                    {
                        Uri uri = imageReturnedIntent.getData();
                        con.getImagesPaths().add(con.getPath(getActivity(), uri));
                    }
                  СlickCounter++;
0
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 15:19  [ТС]
Чото я не понимаю совсем. А можно, плыз, поподробней?

1) Я же в RESULT_OK попадаю, когда юзер выбрал фотки и нажал open, то есть я знаю общее количество выбранных фоток:

numberOfImages = imageReturnedIntent.getClipData().getIte mCount();

Как мне тогда применить Counter ?

Может есть какой-то "callback" при каждом клике юзера по фотке?

2) А в каких случаях срабатывает FIRST_USER?

Я уже думал выдавать Тоаст, что выбрали больше 5 фоток, перезапускать галерею(и это работает, без проблем), но тогда вопрос, как в галерее программно выделить уже выбранные юзером ранее фотки?

Сами Uri или path, не важно, выбранных фоток, у меня есть на этот момент, я их вытащил все в том же RESULT_OK.
Но именно как, какой функцией, методом программно установить выбор фоток в галерее, зная их Uri или path?

Если я совсем вас неверно понял, большой плыз, объясните свою идею подробней, было бы вообще супер, если бы кусок кода.

Добавлено через 42 минуты
Я, наверное, самое главное не сказал. Галерея стандартная. Может от этого все беды и поэтому весь функционал не удается реализовать?
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
23.11.2017, 18:09
Все просто.
В intent.putExtra("counter", ClickCounter) передаем количество уже выбраных, в запущеном активити извекаем его из интенда, сравниваем с числом 5, и если сходится или превышает, тогда отправляем не RESULT_OK, а FIRST_USER.
И тогда либо ничего не делаем, либо выводим месагу типа "Перебор дружище ничего больше не получишь", или что другое вытворяем.
0
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 18:20  [ТС]
Так на момент запуска галереи количество выбранных равно 0. И запущенная галерея - стандартная, из нее особо ничего не извлечешь или я не знаю как. Из нее возвращается Result_OK, количество выбранных и вроде как все.
Как контролировать каждый клик - непонятно, есть подозрение, что никак.
Как отметить галачками ранее выбранные фото при повторном запуске - тоже непонятно, тоже скорее всего никак.
Может вы рассказываете вариант для самописной галереи? Или я опять чего-то не понимаю?
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
23.11.2017, 18:28
Uri tempUri = выносим чтоб было



в функии будет
Java
1
2
3
4
5
6
7
8
                           try {
                                tempUri = imageReturnedIntent.getClipData().getItemAt(i).getUri();
 
                                con.getImagesPaths().add(con.getPath(getActivity(), tempUri));
 
                                Log.d("con.getImagesPaths() = ", con.getImagesPaths().get(i));//OK
                            }
                            catch (Exception e)
tempUri всегда имеет последние данные, которые видны всему коду файла что ниже private Uri tempUri;

дале в акттивити (от которого хотим результат) делаем

Java
1
2
3
4
5
6
7
bandle = this.getIntent().getExtras();
ammount = bandle.getInt("callsign");
if (ammount >=5){
Intent returnIntent = new Intent();
setResult(Activity.RESULT_FIRST_USER,returnIntent);
finish();
}
Ну вот так, типа того!
0
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 18:43  [ТС]
Так это же уже OnActivityResult, галерея уже закрыта на момент:
Java
1
2
3
4
5
6
7
8
 try {
                                tempUri = imageReturnedIntent.getClipData().getItemAt(i).getUri();
 
                                con.getImagesPaths().add(con.getPath(getActivity(), tempUri));
 
                                Log.d("con.getImagesPaths() = ", con.getImagesPaths().get(i));//OK
                            }
                            catch (Exception e)
А в активити я, вроде как, ничего дописать не могу, это же стандартная галерея. Или я не знаю как это сделать.
Я ее вызываю так:

Java
1
2
3
4
5
                            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 - 5"), PICK_IMAGE_MULTIPLE);
Я думал может существует какой-то хитрый параметр, который можно указать при помощи extra стандартному приложению, запускаемому через Intent.createChooser?
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
23.11.2017, 18:46
Смотриж
Когда хоть что то выбрал юзер, он же отработает в resultCode == RESULT_OK - Правильно?
Тогда там же успешное завершение выбора мы можем зафиксировать
Это будет так


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
private Uri tempUri;
int clickCounter =0;
 
 
 
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
    {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
 
        switch(requestCode)
        {
            case PICK_IMAGE_MULTIPLE:
                if(resultCode == RESULT_OK)
                {
                    con.newImagesPathsList();//create new List for paths
 
                    int numberOfImages;
 
                    //тут нуллпоинтер .getItemCount(), когда выбираешь 1 штук
 
                    ClipData clipData = imageReturnedIntent.getClipData();
 
                    if (clickCounter == null) //choiced 1 file
                    {
                        Uri uri = imageReturnedIntent.getData();
                        con.getImagesPaths().add(con.getPath(getActivity(), uri));
 
                    }
                    else {
 
                        numberOfImages = imageReturnedIntent.getClipData().getItemCount();
 
                        Log.d("numberOfImages = ", numberOfImages + "");
 
 
             //           for (int i = 0; i < numberOfImages; i++) {
                            try {
                                tempUri = imageReturnedIntent.getClipData().getItemAt(i).getUri();
 
                                con.getImagesPaths().add(con.getPath(getActivity(), tempUri));
 
                                Log.d("con.getImagesPaths() = ", con.getImagesPaths().get(i));//OK
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                                clickCounter++;
 //                       }
}
Все мы знаем сколько успешных выборов свершилось!

Когда дергаем АктивитиФоРезалт посылаем ему текущий счетчик
btnChoice.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTI PLE, true);
intent.putExtra("counter", ClickCounter); /////// вот он счетчик
intent.setAction(Intent.ACTION_GET_CONTE NT);
startActivityForResult(Intent.createChoo ser(intent,"Select Picture: 1 - 5"), PICK_IMAGE_MULTIPLE);
}
});


А в самом АктивитиФоРезалт обрабатываем
Java
1
2
3
4
5
6
7
8
bandle = this.getIntent().getExtras();
ammount = bandle.getInt("callsign");
if (ammount >=5){
Intent returnIntent = new Intent();
setResult(Activity.RESULT_FIRST_USER,returnIntent);
finish();
} else {
тот код который сейчас отправляет RESULT_OK.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2017, 18:46
Помогаю со студенческими работами здесь

Как ограничить количество в MySQL
Доброго времени суток. Есть 2 таблицы, как пример. Таблица 1.(Тип издания) Название (Каждое уникально) Тип (Базовый или Эксклюзив)...

Как ограничить количество выполняемых функций?
Приветствую Есть такая функция: function func(param,i){ $.ajax( { url: 'func.php?param=' + param, dataType: 'text',...

Как в подзапросе ограничить количество записей?
Например select id from nametable1 where titleId in (select id from nametable2 where abc&gt;5 limit 10);Только limit не работает. Видимо...

Как ограничить количество членов списка
есть объект возвращающий заполняемый список List. В некоторых случаях количество членов списка безгранично, а в некоторых нет. Как указать...

Как ограничить количество подключений к БД AbsoluteDatabase
Привет Всем! Подскажите пожалуйста, как ограничить количество подключений к БД AbsoluteDatabase? Дело в том, что как при создании базы (в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru