Réponse mise à jour, près de 5 ans plus tard:
Le code dans la réponse d'origine ne fonctionne plus de manière fiable, car les images provenant de diverses sources retournent parfois avec un URI de contenu différent, c'est-à-dire content://
plutôt que file://
. Une meilleure solution consiste à simplement utiliser context.getContentResolver().openInputStream(intent.getData())
, car cela retournera un InputStream que vous pouvez gérer comme vous le souhaitez.
Par exemple, BitmapFactory.decodeStream()
fonctionne parfaitement dans cette situation, car vous pouvez également utiliser les champs Options et inSampleSize pour sous-échantillonner des images volumineuses et éviter les problèmes de mémoire.
Cependant, des choses comme Google Drive retournent les URI aux images qui n'ont pas encore été téléchargées. Par conséquent, vous devez exécuter le code getContentResolver () sur un thread d'arrière-plan.
Réponse originale:
Les autres réponses ont expliqué comment envoyer l'intention, mais elles n'ont pas bien expliqué comment gérer la réponse. Voici quelques exemples de code sur la façon de procéder:
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);
}
}
}
Après cela, vous avez l'image sélectionnée stockée dans "yourSelectedImage" pour faire ce que vous voulez. Ce code fonctionne en obtenant l'emplacement de l'image dans la base de données ContentResolver, mais cela ne suffit pas en soi. Chaque image contient environ 18 colonnes d'informations, allant de son chemin de fichier jusqu'à la date de la dernière modification aux coordonnées GPS de l'endroit où la photo a été prise, bien que de nombreux champs ne soient pas réellement utilisés.
Pour gagner du temps car vous n'avez pas réellement besoin des autres champs, la recherche par curseur se fait avec un filtre. Le filtre fonctionne en spécifiant le nom de la colonne souhaitée, MediaStore.Images.Media.DATA, qui est le chemin d'accès, puis en donnant cette chaîne [] à la requête du curseur. La requête de curseur revient avec le chemin d'accès, mais vous ne savez pas dans quelle colonne elle se trouve jusqu'à ce que vous utilisiez le columnIndex
code. Cela obtient simplement le numéro de la colonne en fonction de son nom, le même que celui utilisé dans le processus de filtrage. Une fois que vous avez cela, vous pouvez enfin décoder l'image en bitmap avec la dernière ligne de code que j'ai donnée.