Diese Frage wurde ursprünglich für Android 1.6 gestellt.
Ich arbeite an Fotooptionen in meiner App.
Ich habe eine Schaltfläche und eine Bildansicht in meiner Aktivität. Wenn ich auf die Schaltfläche klicke, wird sie zur Galerie weitergeleitet und ich kann ein Bild auswählen. Das ausgewählte Bild wird in meiner ImageView angezeigt.
android
android-image
android-gallery
Praveen
quelle
quelle
Antworten:
Aktualisierte Antwort, fast 5 Jahre später:
Der Code in der ursprünglichen Antwort funktioniert nicht mehr zuverlässig, da Bilder aus verschiedenen Quellen manchmal mit einem anderen Inhalts-URI zurückgegeben werden, dh
content://
nichtfile://
. Eine bessere Lösung ist die einfache Verwendungcontext.getContentResolver().openInputStream(intent.getData())
, da dadurch ein InputStream zurückgegeben wird, den Sie nach Belieben verarbeiten können.Funktioniert beispielsweise
BitmapFactory.decodeStream()
in dieser Situation einwandfrei, da Sie dann auch das Feld Optionen und inSampleSize verwenden können, um große Bilder herunterzusampeln und Speicherprobleme zu vermeiden.Dinge wie Google Drive geben jedoch URIs an Bilder zurück, die noch nicht heruntergeladen wurden. Daher müssen Sie den Code getContentResolver () für einen Hintergrundthread ausführen.
Ursprüngliche Antwort:
Die anderen Antworten erklärten, wie man die Absicht sendet, aber sie erklärten nicht gut, wie man mit der Antwort umgeht. Hier ist ein Beispielcode dafür:
Danach haben Sie das ausgewählte Bild in "yourSelectedImage" gespeichert, um zu tun, was Sie wollen. Dieser Code ermittelt den Speicherort des Bildes in der ContentResolver-Datenbank. Dies allein reicht jedoch nicht aus. Jedes Bild enthält ungefähr 18 Informationsspalten, angefangen vom Dateipfad über das Datum der letzten Änderung bis hin zu den GPS-Koordinaten, an denen das Foto aufgenommen wurde, obwohl viele der Felder nicht tatsächlich verwendet werden.
Um Zeit zu sparen, da Sie die anderen Felder nicht benötigen, wird die Cursorsuche mit einem Filter durchgeführt. Der Filter gibt den Namen der gewünschten Spalte an, MediaStore.Images.Media.DATA, den Pfad, und gibt diese Zeichenfolge [] an die Cursorabfrage weiter. Die Cursorabfrage wird mit dem Pfad zurückgegeben, aber Sie wissen nicht, in welcher Spalte sie sich befindet, bis Sie den
columnIndex
Code verwenden. Dadurch wird einfach die Nummer der Spalte basierend auf ihrem Namen ermittelt, die auch im Filterprozess verwendet wird. Sobald Sie das haben, können Sie das Bild mit der letzten Codezeile, die ich gegeben habe, endlich in eine Bitmap dekodieren.quelle
Absicht starten
Ergebnis verarbeiten
Alternativ können Sie Ihr Bild auch verkleinern, um OutOfMemory-Fehler zu vermeiden.
quelle
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Sie müssen die Galerie-Absicht für ein Ergebnis starten.
Dann
onActivityForResult
rufen Sieintent.getData()
die Uri des Bildes zu erhalten. Dann müssen Sie das Bild vom ContentProvider abrufen.quelle
Hier ist ein getesteter Code für Bild und Video. Er funktioniert auch für alle APIs unter 19 und über 19.
Bild:
Video:
.
quelle
Führen Sie dies aus, um die Galerie zu starten und dem Benutzer die Auswahl eines Bildes zu ermöglichen:
onActivityResult()
Verwenden Sie dann in Ihrer Verwendung die URI des zurückgegebenen Bilds, um das Bild in Ihrer ImageView festzulegen.quelle
quelle
quelle
Aus bestimmten Gründen
onActivityResult()
versuchen alle Antworten in diesem Thread, das Empfangene nachzubearbeiten, z.Uri
B. den tatsächlichen Pfad des Bildes abzurufen und dann zu verwendenBitmapFactory.decodeFile(path)
, um das zu erhaltenBitmap
.Dieser Schritt ist nicht erforderlich. Die
ImageView
Klasse hat eine Methode namenssetImageURI(uri)
. Gib dein Uri weiter und du solltest fertig sein.Ein vollständiges Arbeitsbeispiel finden Sie hier: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS: Das
Einfügen
Bitmap
in eine separate Variable ist in Fällen sinnvoll, in denen das zu ladende Bild zu groß ist, um in den Speicher zu passen, und eineOurOfMemoryError
Verkleinerung erforderlich ist, um dies zu verhindern , wie in der @ siiamii-Antwort gezeigt.quelle
Rufen Sie die Methode selectImage auf.
quelle
quelle