Risposta aggiornata, circa 5 anni dopo:
Il codice nella risposta originale non funziona più in modo affidabile, poiché le immagini da varie fonti a volte restituiscono con un URI di contenuto diverso, ovvero content://
anziché file://
. Una soluzione migliore è semplicemente usarecontext.getContentResolver().openInputStream(intent.getData())
, poiché ciò restituirà un InputStream che è possibile gestire come si sceglie.
Per esempio, BitmapFactory.decodeStream()
funziona perfettamente in questa situazione, poiché è anche possibile utilizzare i campi Opzioni e Dimensioni campione per sottocampionare immagini di grandi dimensioni ed evitare problemi di memoria.
Tuttavia, cose come Google Drive restituiscono gli URI alle immagini che non sono ancora state scaricate. Pertanto è necessario eseguire il codice getContentResolver () su un thread in background.
Risposta originale:
Le altre risposte hanno spiegato come inviare l'intento, ma non hanno spiegato bene come gestire la risposta. Ecco un codice di esempio su come farlo:
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);
}
}
}
Dopo questo, hai l'immagine selezionata memorizzata in "yourSelectedImage" per fare quello che vuoi. Questo codice funziona ottenendo la posizione dell'immagine nel database ContentResolver, ma da solo non è sufficiente. Ogni immagine ha circa 18 colonne di informazioni, che vanno dal suo percorso file alla "data dell'ultima modifica" alle coordinate GPS del luogo in cui è stata scattata la foto, sebbene molti campi non siano effettivamente utilizzati.
Per risparmiare tempo poiché in realtà non sono necessari gli altri campi, la ricerca del cursore viene eseguita con un filtro. Il filtro funziona specificando il nome della colonna desiderata, MediaStore.Images.Media.DATA, che è il percorso, quindi assegnando quella stringa [] alla query del cursore. La query del cursore ritorna con il percorso, ma non si conosce in quale colonna si trova fino a quando non si utilizza il columnIndex
codice. Questo semplicemente ottiene il numero della colonna in base al suo nome, lo stesso usato nel processo di filtraggio. Una volta ottenuto questo, sei finalmente in grado di decodificare l'immagine in una bitmap con l'ultima riga di codice che ho fornito.