Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
viktimolog
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
1

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

22.11.2017, 12:41. Просмотров 281. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2017, 12:41
Ответы с готовыми решениями:

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

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

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

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

Как ограничить количество записей в таблице
Т.е если записей, например, 10 то запретить добавление

7
zoleg
39 / 38 / 7
Регистрация: 10.01.2012
Сообщений: 350
23.11.2017, 14:21 2
Предполагаю что можно поставить счетчик и передать

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
viktimolog
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 15:19  [ТС] 3
Чото я не понимаю совсем. А можно, плыз, поподробней?

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

numberOfImages = imageReturnedIntent.getClipData().getItemCount();

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

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

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

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

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

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

Добавлено через 42 минуты
Я, наверное, самое главное не сказал. Галерея стандартная. Может от этого все беды и поэтому весь функционал не удается реализовать?
0
zoleg
39 / 38 / 7
Регистрация: 10.01.2012
Сообщений: 350
23.11.2017, 18:09 4
Все просто.
В intent.putExtra("counter", ClickCounter) передаем количество уже выбраных, в запущеном активити извекаем его из интенда, сравниваем с числом 5, и если сходится или превышает, тогда отправляем не RESULT_OK, а FIRST_USER.
И тогда либо ничего не делаем, либо выводим месагу типа "Перебор дружище ничего больше не получишь", или что другое вытворяем.
0
viktimolog
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 18:20  [ТС] 5
Так на момент запуска галереи количество выбранных равно 0. И запущенная галерея - стандартная, из нее особо ничего не извлечешь или я не знаю как. Из нее возвращается Result_OK, количество выбранных и вроде как все.
Как контролировать каждый клик - непонятно, есть подозрение, что никак.
Как отметить галачками ранее выбранные фото при повторном запуске - тоже непонятно, тоже скорее всего никак.
Может вы рассказываете вариант для самописной галереи? Или я опять чего-то не понимаю?
0
zoleg
39 / 38 / 7
Регистрация: 10.01.2012
Сообщений: 350
23.11.2017, 18:28 6
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
viktimolog
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
23.11.2017, 18:43  [ТС] 7
Так это же уже 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
zoleg
39 / 38 / 7
Регистрация: 10.01.2012
Сообщений: 350
23.11.2017, 18:46 8
Смотриж
Когда хоть что то выбрал юзер, он же отработает в 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_MULTIPLE, true);
intent.putExtra("counter", ClickCounter); /////// вот он счетчик
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(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
23.11.2017, 18:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2017, 18:46

Как ограничить количество выводимых строк?
Подскажите, как ограничеть количество выводимых строк? Например мне надо...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru