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://
nicht file://
. Eine bessere Lösung ist die einfache Verwendung context.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:
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
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.