Obtenir le nom de fichier et le chemin d'accès à partir de l'URI de la mediastore
J'ai un onActivityResult
de retour d'une mediastore de sélection d'image qui je peux obtenir un URI pour une image en utilisant les suivantes:
Uri selectedImage = data.getData();
De la conversion de cette chaîne donne ça:
content://media/external/images/media/47
Ou à un tracé:
/external/images/media/47
Cependant je n'arrive pas à trouver un moyen de le convertir en un chemin d'accès absolu, que je veux charger l'image dans une image sans avoir à le copier quelque part. Je sais que cela peut être fait en utilisant l'URI et le contenu de résolution, mais cela semble se briser sur le redémarrage du téléphone, je suppose que MediaStore
ne tient pas ses numérotation identique entre les redémarrages.
- Googlers: Si vous êtes venu ici à la recherche de la façon d'obtenir de l'image bitmap à partir d'URI, veuillez consulter la dernière réponse
- gist.github.com/tatocaster/32aad15f6e0c50311626
- API 19 et au-Dessus de la solution est ici, stackoverflow.com/a/51227392/9815519 . Espérons que les gars cela peut vous aider.
Vous devez vous connecter pour publier un commentaire.
Ci-dessous API 19 utiliser ce code pour obtenir le Chemin d'URI:
cursor != null
avant d'effectuercursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
, sinon, il y a une possibilité d'un NullPointerExceptionUri.getPath()
devrait fonctionner.Juste une simple mise à jour sur la première réponse:
mActivity.managedQuery()
est maintenant obsolète. J'ai mis à jour le code avec la nouvelle méthode.android dev source
content://...
chose. J'ai essayé toutes les suggestions ici sans succès. Aucune idée pourquoi?Pour Oreo
Pour Toutes les versions ci-dessous Oreo, j'ai fait cette méthode qui se véritable chemin de l'uri
N'essayez pas de trouver une uri dans le système de fichiers, c'est lent pour aller chercher des choses dans la base de données.
Vous pouvez obtenir une image à partir d'un uri en donnant un flux d'entrée à l'usine comme vous donner un fichier à l'usine:
getContentResolver()
est une méthode deContext
, par stackoverflow.com/questions/3750903/..., afin de l'utilisergetActivity().getContentResolver()
si vous essayez d'obtenir le contenu du fichier dans un Fragment ou imbriqués Fragment.Ici, c'est mon exemple de récupération de nom de fichier, de URI comme file://... et le contenu://... . Il fonctionne pour moi, non seulement avec Android MediaStore mais aussi avec la troisième partie de l'application comme EzExplorer.
if (MediaStore.AUTHORITY.equals(uri.getAuthority()))
Bonnes réponses, dont certains que j'ai l'habitude de venir avec mon propre:
- Je obtenir le chemin d'Uri et d'obtenir l'URI de chemins, et Google a du mal à faire la différence donc, pour toute personne qui a le même problème (par exemple, pour obtenir la vignette de l'
MediaStore
d'une vidéo dont l'emplacement physique que vous avez déjà). L'ancien:Ce dernier (ce que je fais pour les vidéos, mais peut aussi être utilisé pour l'Audio ou de Fichiers ou d'autres types de contenu stocké par la substitution MediaStore.Audio (etc) pour MediaStore.Vidéo):
Fondamentalement, la
DATA
colonne deMediaStore
(ou n'importe quel sous-section vous interrogez) stocke le chemin d'accès au fichier, vous pouvez donc utiliser ce que vous savez de chercher lesDATA
champ, ou utilisez le champ rechercher tout ce que vous voulez.Je puis encore utiliser le
Scheme
comme ci-dessus pour savoir quoi faire avec mes données:Aucune de ces réponses a travaillé pour moi dans tous les cas. J'ai dû aller directement à Google Documents https://developer.android.com/guide/topics/providers/document-provider.html sur ce sujet et a trouvé cette méthode utile:
Vous pouvez utiliser cette image pour l'afficher dans l'Affichage de l'Image.
essayer ce chemin du fichier image à partir de l'Uri
API 19 et au-Dessus de, Chemin du Fichier Image à partir de l'Uri fonctionne parfaitement. J'ai aussi vérifier cette dernière TARTE API 28.
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
à cette ligne:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
Solution pour ceux qui ont des problèmes après le passage à KitKat:
"Cela permet d'obtenir le chemin d'accès au fichier de la MediaProvider, DownloadsProvider, et ExternalStorageProvider, alors qu'elle a diminué pour la officieux de ContentProvider méthode" https://stackoverflow.com/a/20559175/690777
Après l'obtention d'une image de la galerie, il suffit de passer l'URI dans la méthode ci-dessous uniquement pour Android 4.4 (KitKat):
Depuis managedQuery a été abandonné, vous pourriez essayer:
Ici, je vais vous montrer comment créer un bouton PARCOURIR qui, lorsque vous cliquez dessus, il va ouvrir la carte SD, vous devrez sélectionner un Fichier et comme un résultat, vous obtiendrez le nom de fichier et chemin d'accès au fichier de la sélection d'un:
Un bouton qui vous permettra de frapper
La fonction qui sera le Débouché de Nom de Fichier et Chemin d'accès du Fichier
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Après avoir appliqué les méthodes ici, j'obtiens toujours la même chaîne, pas le bon chemin, c'est-à/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Des indices?Cette solution fonctionne pour tous les cas:
C'est trop dur, dans certains cas, obtenir le chemin d'accès à partir de l'URL. Alors, pourquoi avez-vous besoin de la chemin? Pour copier le fichier dans un autre endroit? Vous n'avez pas besoin de le chemin.
Version légèrement modifiée de @PercyPercy - il ne jette pas et juste retourne null si quelque chose va mal:
Ici, vous obtenez le nom du fichier
Simple et facile. Vous pouvez le faire à partir de l'URI comme ci-dessous!
Essayer Cette
Encore, si vous avez trouvé le problème pour obtenir le chemin réel, vous pouvez essayer mes réponses. Réponses ci-dessus ne m'a pas aidé.
Explication:- Cette méthode est l'URI et puis vérifier le niveau de l'API de votre appareil Android après que, selon le niveau API, il génère le chemin Réel. Code pour générer chemin réel de la méthode est différente selon API niveaux.
méthode pour obtenir le Véritable chemin de l'URI
Utiliser cette méthode comme ceci
De sortie:-
String wholeID = DocumentsContract.getDocumentId(uri);
j'obtiens :java.lang.RuntimeException: Failure delivering result
J'ai fait comme ceci:
Parfaitement de travail pour moi à code fixe à partir de ce post:
Comme un add-on, si vous avez besoin de voir si un fichier existe avant d'essayer d'ouvrir un flux d'entrée, vous pouvez utiliser le DocumentsContract.
(Kotlin code)
Depuis les réponses ci-dessus ne fonctionne pas pour moi, ici, c'est la solution qui a fonctionné pour moi:
Pour les deux >19 et <=19 API Niveaux.
Cette méthode couvre tous les cas d'obtenir de chemin d'uri
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);