Aktualisierte Antwort, fast 5 Jahre später:
Der Code in der Originalantwort funktioniert nicht mehr zuverlässig, da Bilder aus verschiedenen Quellen manchmal mit einer anderen Inhalts-URI zurückkehren, d.h. content://
anstelle von file://
. Eine bessere Lösung ist einfach context.getContentResolver().openInputStream(intent.getData())
zu verwenden, da dies einen InputStream zurückgibt, den Sie nach Belieben verarbeiten können.
Zum Beispiel funktioniert BitmapFactory.decodeStream()
perfekt in dieser Situation, da Sie auch die Optionen und das inSampleSize-Feld verwenden können, um große Bilder zu verkleinern und Speicherprobleme zu vermeiden.
Allerdings liefern Dienste wie Google Drive URIs zu Bildern zurück, die noch nicht tatsächlich heruntergeladen wurden. Daher müssen Sie den getContentResolver() Code in einem Hintergrundthread ausführen.
Ursprüngliche Antwort:
Die anderen Antworten haben erklärt, wie man das Intent sendet, aber sie haben nicht gut erklärt, wie man die Antwort verarbeitet. Hier ist ein Beispielcode, wie das gemacht werden kann:
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);
}
}
}
Nach diesem Schritt haben Sie das ausgewählte Bild in "yourSelectedImage" gespeichert, um damit zu tun, was Sie möchten. Dieser Code funktioniert, indem er den Speicherort des Bildes in der ContentResolver-Datenbank abruft, aber allein das reicht nicht aus. Jedes Bild hat ungefähr 18 Spalten Informationen, von seinem Dateipfad bis zum 'Datum der letzten Änderung' bis zu den GPS-Koordinaten, wo das Foto aufgenommen wurde, obwohl viele der Felder tatsächlich nicht verwendet werden.
Um Zeit zu sparen, da Sie die anderen Felder nicht wirklich benötigen, wird eine Cursor-Suche mit einem Filter durchgeführt. Der Filter funktioniert, indem der Name der gewünschten Spalte angegeben wird, MediaStore.Images.Media.DATA, das ist der Pfad, und dann wird dieses string[] der Cursor-Abfrage übergeben. Die Cursor-Abfrage gibt den Pfad zurück, aber Sie wissen nicht, in welcher Spalte er sich befindet, bis Sie den columnIndex
Code verwenden. Dieser bekommt einfach die Nummer der Spalte basierend auf ihrem Namen, derselbe, der im Filterungsprozess verwendet wurde. Wenn Sie das haben, sind Sie endlich in der Lage, das Bild in ein Bitmap mit der letzten Zeile des Codes zu dekodieren, den ich gegeben habe.
1 Stimmen
Schau dir diese Antwort an, dort habe ich einen verbesserten Code gepostet, um auch Auswahl aus Dateimanagern zu verarbeiten stackoverflow.com/questions/2169649/…