To pytanie zostało pierwotnie zadane dla Androida 1.6.
Pracuję nad opcjami zdjęć w mojej aplikacji.
W mojej aktywności mam przycisk i ImageView. Po kliknięciu przycisku nastąpi przekierowanie do galerii i będę mógł wybrać obraz. Wybrany obraz pojawi się w moim ImageView.
android
android-image
android-gallery
Praveen
źródło
źródło
Odpowiedzi:
Zaktualizowana odpowiedź, prawie 5 lat później:
Kod w oryginalnej odpowiedzi nie działa niezawodnie, jak obrazy z różnych źródeł, czasami powrócić z różną zawartością URI, czyli
content://
zamiastfile://
. Lepszym rozwiązaniem jest po prostu użyciecontext.getContentResolver().openInputStream(intent.getData())
, ponieważ zwróci InputStream, który możesz obsłużyć według własnego wyboru.Na przykład
BitmapFactory.decodeStream()
działa idealnie w tej sytuacji, ponieważ można również użyć pola Opcje i inSampleSize, aby zmniejszyć próbkę dużych obrazów i uniknąć problemów z pamięcią.Jednak rzeczy takie jak Dysk Google zwracają identyfikatory URI do obrazów, które nie zostały jeszcze pobrane. Dlatego musisz wykonać kod getContentResolver () w wątku w tle.
Oryginalna odpowiedź:
Pozostałe odpowiedzi wyjaśniły, jak wysłać zamiar, ale nie wyjaśniły dobrze, jak sobie z tym poradzić. Oto przykładowy kod, jak to zrobić:
Następnie masz wybrany obraz zapisany w „yourSelectedImage”, aby robić, co chcesz. Ten kod działa, pobierając lokalizację obrazu w bazie danych ContentResolver, ale sam w sobie nie wystarczy. Każde zdjęcie zawiera około 18 kolumn informacji, od ścieżki pliku do „ostatniej modyfikacji daty” do współrzędnych GPS miejsca, w którym zdjęcie zostało zrobione, chociaż wiele pól nie jest faktycznie używanych.
Aby zaoszczędzić czas, ponieważ tak naprawdę nie potrzebujesz innych pól, wyszukiwanie kursorem odbywa się za pomocą filtra. Filtr działa poprzez określenie nazwy żądanej kolumny, MediaStore.Images.Media.DATA, która jest ścieżką, a następnie podanie tego ciągu [] do zapytania kursora. Zapytanie kursora powraca ze ścieżką, ale nie wiesz, w której kolumnie się znajduje, dopóki nie użyjesz
columnIndex
kodu. To po prostu pobiera numer kolumny na podstawie jej nazwy, tej samej, której użyto w procesie filtrowania. Gdy to osiągniesz, w końcu możesz dekodować obraz do bitmapy za pomocą ostatniego wiersza kodu, który podałem.źródło
Zacznij zamiar
Wynik procesu
Alternatywnie możesz również zmniejszyć próbkę obrazu, aby uniknąć błędów OutOfMemory.
źródło
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Musisz rozpocząć zamiar galerii, aby uzyskać wynik.
Następnie
onActivityForResult
zadzwoń,intent.getData()
aby uzyskać Uri obrazu. Następnie musisz pobrać obraz z ContentProvider.źródło
Oto przetestowany kod obrazu i wideo, który będzie działał dla wszystkich interfejsów API mniejszych niż 19 i większych niż 19.
Wizerunek:
Wideo:
.
źródło
Zrób to, aby uruchomić galerię i pozwolić użytkownikowi wybrać obraz:
Następnie przy
onActivityResult()
użyciu URI obrazu, który jest zwracany, aby ustawić obraz w ImageView.źródło
źródło
źródło
Z niektórych powodów wszystkie odpowiedzi w tym wątku
onActivityResult()
próbują przetworzyć otrzymane daneUri
, na przykład uzyskać prawdziwą ścieżkę obrazu, a następnie użyć,BitmapFactory.decodeFile(path)
aby uzyskaćBitmap
.Ten krok jest niepotrzebny.
ImageView
Klasa ma metodę nazwiesetImageURI(uri)
. Podaj do niego swoje URI i powinieneś skończyć.Aby uzyskać pełny działający przykład, możesz zajrzeć tutaj: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
Wprowadzenie
Bitmap
oddzielnej zmiennej miałoby sens w przypadkach, gdy obraz do załadowania jest zbyt duży, aby zmieścił się w pamięci, a konieczne jest wykonanie operacji zmniejszania skaliOurOfMemoryError
, jak pokazano w odpowiedzi @siamii.źródło
wywołaj metodę selectImage jak-
źródło
źródło