Więc w zasadzie to, co próbuję osiągnąć, to otworzyć Gallery
w systemie Android i pozwolić użytkownikowi wybrać multiple images
. Teraz to pytanie jest zadawane często, ale nie jestem zadowolony z odpowiedzi. Głównie dlatego, że znalazłem coś interesującego w de docs w moim IDE (wrócę do tego później) i dlatego nie chcę używać niestandardowego adaptera, ale tylko waniliowego.
Teraz mój kod do wyboru jednego obrazu to:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Teraz ludzie w SO i innych witrynach powiedzą Ci, że masz dwie opcje:
1) Nie używaj, ACTION_GET_CONTENT
ale ACTION_SEND_MULTIPLE
zamiast tego.
Ten nie działa. Ten jest zgodny z dokumentacją dotyczącą sending
plików, a nie, retrieving
i dokładnie to robi. Podczas korzystania z ACTION_SEND_MULTIPLE otworzyło się okno na moim urządzeniu, w którym muszę wybrać aplikację, do której mam wysłać moje dane. Nie tego chcę, więc zastanawiam się, jak ludzie osiągnęli to dzięki temu rozwiązaniu. Czy coś mi brakuje?
2) Zaimplementuj custom Gallery
. To moja ostatnia opcja, którą rozważę, ponieważ nie jest to, czego szukam, ponieważ muszę sam ją stylizować I dlaczego do cholery po prostu nie możesz wybrać wielu zdjęć w galerii waniliowej?
Musi istnieć opcja na to .. Teraz interesująca rzecz, którą znalazłem, jest taka:
znalazłem to w opisie docs ACTION_GET_CONTENT
.
Jeśli wywołujący może obsłużyć wiele zwracanych elementów (użytkownik dokonujący wielokrotnego wyboru), może określić EXTRA_ALLOW_MULTIPLE, aby to wskazać.
To jest całkiem interesujące. Tutaj odnoszą się do przypadku użycia, w którym użytkownik może wybrać wiele elementów?
Później w dokumentach mówią:
Możesz użyć EXTRA_ALLOW_MULTIPLE, aby umożliwić użytkownikowi wybranie wielu elementów.
Więc to jest całkiem oczywiste, prawda? To jest to, czego potrzebuję. Ale moje następujące pytanie brzmi: gdzie mogę to umieścić EXTRA_ALLOW_MULTIPLE
? Smutne jest to, że nie mogę znaleźć tego nigdzie w podręczniku programistów.android, a także nie jest to zdefiniowane jako stała w klasie INTENT.
Czy ktoś może mi w tym pomóc EXTRA_ALLOW_MULTIPLE
?
źródło
EXTRA_ALLOW_MULTIPLE
pozwala wybrać wiele elementów. Uzyskaj identyfikatory URI, wywołującgetClipData()
zwróconą intencję wonActivityResult
. Jedynym problemem jest to, że widżet galerii nie pozwala na wielokrotny wybór. W takim przypadku kliknięcie dowolnego obrazu zakończy wybór i możesz uzyskać identyfikator URI (pojedynczego elementu), wywołującgetData
zwróconą intencjęOdpowiedzi:
Opcja EXTRA_ALLOW_MULTIPLE jest ustawiana na intencji za pomocą metody Intent.putExtra ():
Twój kod powyżej powinien wyglądać następująco:
Uwaga: ta
EXTRA_ALLOW_MULTIPLE
opcja jest dostępna tylko w Android API 18 i nowszych.źródło
Intent.getClipData
. Posiada tablicę ClipData Item.Zdefiniuj te zmienne w klasie:
Załóżmy, że onClick na przycisku powinien otworzyć galerię, aby wybrać obrazy
Następnie należy zastąpić metodę onActivityResult
PAMIĘTAJ, ŻE: galeria nie daje możliwości wyboru wielu obrazów, dlatego otwieramy tutaj wszystkie studio obrazów, z których można wybrać wiele obrazów. i nie zapomnij dodać uprawnień do swojego manifestu
BARDZO WAŻNE: getData (); aby uzyskać jeden obraz i zapisałem go tutaj w imageEncoded String jeśli użytkownik wybierze wiele obrazów, powinny one być zapisane na liście
Musisz więc sprawdzić, który jest pusty, aby użyć drugiego
Życzę miłej próby i innym
źródło
Wiele z tych odpowiedzi ma podobieństwa, ale we wszystkich brakuje najważniejszej części, która jest dostępna. Przed sprawdzeniem
onActivityResult
sprawdź, czydata.getClipData
jest pustadata.getData
Kod wywołujący wybór plików:
Kod umożliwiający pobranie wszystkich wybranych obrazów:
Pamiętaj, że na niektórych urządzeniach w selektorze Androida są dostępne Zdjęcia i Galeria. Zdjęcia umożliwia wybranie wielu obrazów. Galeria umożliwia tylko jedną naraz.
źródło
getData()
czasami NIE będzie miał wartości NULL, ale będzie miał tylko jeden Uri. Jeśli chcesz poradzić sobie z sytuacją, gdy użytkownik wybierze wiele plików, sprawdźgetClipData()
wcześniejgetData()
- jeśli dane klipu nie są puste, użytkownik mógł wybrać wiele obrazów. Obsługa getClipData przed getData, ale obsługa obu przypadków jest ważna dla obsługi różnych urządzeń, przy jednoczesnym umożliwieniu wielu Uris.Mam nadzieję, że ta odpowiedź nie jest spóźniona. Ponieważ widżet galerii nie obsługuje domyślnie wielokrotnego wyboru, ale możesz dostosować widok siatki, który zaakceptował Twój zamiar wielokrotnego wyboru. Inną opcją jest rozszerzenie widoku galerii i dodanie własnego kodu, aby umożliwić wielokrotny wybór.
Oto prosta biblioteka, która może to zrobić: https://github.com/luminousman/MultipleImagePick
Aktualizacja :
Z komentarza @ ilsy, CustomGalleryActivity w tej bibliotece używa
manageQuery
, która jest przestarzała, więc należy ją zmienić na tę odpowiedźgetContentResolver().query()
icursor.close()
polubićźródło
getContentResolver().query()
w wątku interfejsu użytkownika. Przeczytaj o programach ładujących i bibliotece wsparcia..cacheOnDisc()
również przestarzałe, więc zmień je na.cacheOnDisc(true)
parametr booleanZainicjuj instancję:
W onActivityResult musisz napisać to, jeśli-else 2 blok. Jeden dla pojedynczego obrazu, a drugi dla wielu obrazów.
Najważniejsza część, Pobierz ścieżkę obrazu z uri :
Mam nadzieję, że to może ci pomóc.
źródło
Mam null z
Cursor
. Następnie znalazłem rozwiązanie, które pozwoli przekształcić plikUri
w,Bitmap
które działa idealnie.Oto rozwiązanie, które działa dla mnie:
źródło
Cześć, poniższy kod działa dobrze.
Chcesz więcej wyjaśnień. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
źródło
Miałem też ten sam problem. Zależało mi również na tym, aby użytkownicy mogli łatwo robić zdjęcia podczas wybierania zdjęć z galerii. Nie mogłem znaleźć natywnego sposobu na zrobienie tego, dlatego zdecydowałem się stworzyć projekt open source. To jest bardzo podobne do MultipleImagePick, ale po prostu lepszy sposób jego implementacji.
https://github.com/giljulio/android-multiple-image-picker
źródło
Wypróbuj ten IntentChooser . Po prostu dodaj kilka linii kodu, resztę zrobiłem za Ciebie.
PS: jak wspomniano w odpowiedziach powyżej, EXTRA_ALLOW_MULTIPLE jest dostępne tylko dla API> = 18. Niektóre aplikacje galerii nie udostępniają tej funkcji (Zdjęcia i Dokumenty Google (
com.android.documentsui
)).źródło
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);