Cette question a été initialement posée pour Android 1.6.
Je travaille sur les options de photos dans mon application.
J'ai un bouton et une ImageView dans mon activité. Lorsque je clique sur le bouton, il est redirigé vers la galerie et je peux sélectionner une image. L'image sélectionnée apparaîtrait dans mon ImageView.
android
android-image
android-gallery
Praveen
la source
la source
Réponses:
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 quefile://
. Une meilleure solution consiste à simplement utilisercontext.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:
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.la source
Intention de départ
Résultat du processus
Alternativement, vous pouvez également sous-échantillonner votre image pour éviter les erreurs OutOfMemory.
la source
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Vous devez démarrer l'intention de la galerie pour un résultat.
Ensuite
onActivityForResult
, appelezintent.getData()
pour obtenir l'URI de l'image. Ensuite, vous devez obtenir l'image du ContentProvider.la source
Voici un code testé pour l'image et la vidéo qui fonctionnera également pour toutes les API inférieures à 19 et supérieures à 19.
Image:
Vidéo:
.
la source
Faites cela pour lancer la galerie et permettre à l'utilisateur de choisir une image:
Ensuite, dans votre
onActivityResult()
utilisation, l'URI de l'image qui est retournée pour définir l'image sur votre ImageView.la source
la source
la source
Pour certaines raisons, toutes les réponses de ce fil, dans le
onActivityResult()
but de post-traiter le reçuUri
, comme obtenir le vrai chemin de l'image, puis l'utiliserBitmapFactory.decodeFile(path)
pour obtenir leBitmap
.Cette étape est inutile. La
ImageView
classe a une méthode appeléesetImageURI(uri)
. Passez votre uri et vous devriez avoir terminé.Pour un exemple de travail complet, vous pouvez jeter un œil ici: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
obtenir le
Bitmap
dans une variable distincte aurait du sens dans les cas où l'image à charger est trop grande pour tenir dans la mémoire, et une opération de réduction d'échelle est nécessaire pour empêcherOurOfMemoryError
, comme indiqué dans la réponse @siamii.la source
appelez la méthode chooseImage comme-
la source
la source