Comment choisir une image de la galerie (Carte SD) pour mon application?
Cette question a été initialement demandé pour Android 1.6.
Je suis en train de travailler sur des photos d'options dans mon application.
J'ai un bouton et une ImageView dans mon Activité. Lorsque je clique sur le bouton, il redirige vers la galerie et je voudrais être en mesure de sélectionner une image. L'image sélectionnée apparaît dans mon ImageView.
- regardez cette réponse, j'ai posté une amélioration du code pour gérer les pics de gestionnaires de fichiers aussi stackoverflow.com/questions/2169649/...
Vous devez vous connecter pour publier un commentaire.
Mise à jour de la réponse, presque 5 ans plus tard:
Le code dans la réponse originale à cette question ne fonctionne plus de manière fiable, que les images provenant de diverses sources, parfois, de retour avec un contenu différent URI, c'est à dire
content://
plutôt quefile://
. Une meilleure solution est d'utiliser simplementcontext.getContentResolver().openInputStream(intent.getData())
, qui sera de retour un InputStream que vous pouvez gérer comme vous le souhaitez.Par exemple,
BitmapFactory.decodeStream()
fonctionne parfaitement dans cette situation, vous pouvez également utiliser les Options et les inSampleSize champ de sous-échantillonner les images de grande taille et d'éviter les problèmes de mémoire.Cependant, des choses comme Google Drive retour Uri pour les images qui en réalité n'ont pas encore été téléchargé. Par conséquent, vous devez effectuer les getContentResolver() code sur un thread d'arrière-plan.
Réponse originale à cette question:
Autres réponses expliqué comment envoyer l'intention, mais ils n'ont pas bien expliquer comment gérer la réponse. Voici un exemple de code sur la façon de le faire:
Après cela, vous avez sélectionné une image stockée dans "yourSelectedImage" pour faire ce que vous voulez avec. Ce code fonctionne par l'obtention de l'emplacement de l'image dans le ContentResolver base de données, mais qui, en soi, n'est pas suffisant. Chaque image a environ 18 colonnes d'informations, allant de son chemin d'accès à la 'date de dernière modification" pour les coordonnées GPS de l'endroit où la photo a été prise, bien que de nombreux champs ne sont pas effectivement utilisés.
Pour gagner du temps que vous n'avez pas besoin de les autres champs, le curseur de la recherche se fait avec un filtre. Le filtre fonctionne en spécifiant le nom de la colonne que vous voulez, MediaStore.Les Images.Médias.Les DONNÉES, qui est le chemin, puis donner que string[] pour le curseur de la requête. Le curseur de la requête renvoie le chemin d'accès, mais vous ne savez pas quelle colonne il est jusqu'à ce que vous utilisez le
columnIndex
code. Qui obtient tout 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 êtes enfin en mesure de décoder l'image en une image bitmap avec la dernière ligne de code que j'ai donné.http
url :SCommencer intention
Résultat du processus
Alternativement, vous pouvez également diminuer votre image afin d'éviter des erreurs de dépassement de mémoire.
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Vous devez commencer à la galerie de l'intention d'un résultat.
Puis dans
onActivityForResult
, appelintent.getData()
pour obtenir l'Uri de l'Image. Alors vous avez besoin pour obtenir l'Image de la ContentProvider.Voici un code testé pour l'image et la vidéo.Elle fonctionne pour toutes les Api de moins de 19 ans et de plus de 19 ainsi.
Image:
Vidéo:
.
Ce faire, pour le lancement de la galerie et de permettre à l'utilisateur de choisir une image:
Puis dans votre
onActivityResult()
utiliser l'URI de l'image qui est renvoyée pour définir l'image sur votre ImageView.Pour certaines raisons, toutes les réponses dans ce fil, dans
onActivityResult()
essayer de post-traiter les reçusUri
, comme obtenir le véritable chemin de l'image et d'utiliserBitmapFactory.decodeFile(path)
pour obtenir leBitmap
.Cette étape est inutile. Le
ImageView
classe a une méthode appeléesetImageURI(uri)
. Passer votre uri et vous devriez faire.Pour un travail complet exemple, vous pouvez prendre un coup d'oeil ici: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
L'obtention de la
Bitmap
dans une variable distincte du sens dans les cas où l'image de chargement est trop grand pour tenir dans la mémoire, et un vers le bas l'échelle de l'opération est nécessaire pour éviterOurOfMemoryError
, comme montré dans l' @siamii réponse.appel chooseImage méthode-