J'ai un onActivityResult
retour d'une sélection d'image de médiastore que je peux obtenir un URI pour une image en utilisant ce qui suit:
Uri selectedImage = data.getData();
La conversion de ceci en chaîne donne ceci:
content://media/external/images/media/47
Ou à un chemin donne:
/external/images/media/47
Cependant, je n'arrive pas à trouver un moyen de convertir cela en un chemin absolu, car je veux charger l'image dans un bitmap sans avoir à la copier quelque part. Je sais que cela peut être fait en utilisant l'URI et le résolveur de contenu, mais cela semble rompre au redémarrage du téléphone, je suppose MediaStore
que sa numérotation ne reste pas la même entre les redémarrages.
android
uri
absolute-path
mediastore
stealthcopter
la source
la source
Réponses:
Ci-dessous, l'API 19 utilise ce code pour obtenir le chemin de fichier à partir de l'URI:
la source
Juste une simple mise à jour sur la première réponse:
mActivity.managedQuery()
est désormais obsolète. J'ai mis à jour le code avec la nouvelle méthode.source de développement android
la source
content://...
chose. J'ai essayé toutes les suggestions ici sans chance. Une idée pourquoi?Pour Oreo
Pour toutes les versions ci-dessous Oreo, j'ai fait cette méthode qui obtient un vrai chemin depuis uri
la source
N'essayez pas de trouver un uri dans le système de fichiers, il est lent d'aller chercher dans la base de données.
Vous pouvez obtenir un bitmap à partir d'un uri en donnant un flux d'entrée à l'usine comme vous donnez un fichier à l'usine:
la source
Voici mon exemple pour obtenir le nom de fichier, à partir d'URI comme file: // ... et content: // .... Cela fonctionne pour moi non seulement avec Android MediaStore mais aussi avec une application tierce comme EzExplorer.
la source
Bonnes réponses existantes, dont j'ai l'habitude de trouver les miennes:
Je dois obtenir le chemin à partir des URI et obtenir l'URI à partir des chemins, et Google a du mal à faire la différence, donc pour quiconque a le même problème (par exemple, pour obtenir la vignette à partir
MediaStore
d'une vidéo dont vous avez déjà l'emplacement physique) ). L'ancien:Ce dernier (ce que je fais pour les vidéos, mais peut également être utilisé pour l'audio ou les fichiers ou d'autres types de contenu stocké en substituant MediaStore.Audio (etc.) à MediaStore.Video):
Fondamentalement, la
DATA
colonneMediaStore
(ou la sous-section de celle-ci que vous interrogez) stocke le chemin du fichier, vous utilisez donc ce que vous savez pour rechercher ceDATA
champ, ou utilisez le champ pour rechercher ce que vous voulez d'autre.J'utilise ensuite le
Scheme
comme ci-dessus pour comprendre quoi faire avec mes données:la source
Aucune de ces réponses n'a fonctionné pour moi dans tous les cas. J'ai dû aller directement à la documentation de Google https://developer.android.com/guide/topics/providers/document-provider.html sur ce sujet et j'ai trouvé cette méthode utile:
Vous pouvez utiliser ce bitmap pour l'afficher dans une vue d'image.
la source
API 19 et au-dessus , Image File Path d'Uri fonctionne parfaitement. Je vérifie également cette dernière API PIE 28 .
la source
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
sur cette ligne:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
essayez ce chemin d'accès au fichier image à partir d'Uri
la source
Solution pour ceux qui ont des problèmes après avoir migré vers KitKat:
"Cela obtiendra le chemin d'accès au fichier à partir de MediaProvider, DownloadsProvider et ExternalStorageProvider, tout en retombant à la méthode non officielle ContentProvider" https://stackoverflow.com/a/20559175/690777
la source
Après avoir obtenu une image de la galerie, passez simplement l'URI dans la méthode ci-dessous uniquement pour Android 4.4 (KitKat):
la source
Essaye ça
Pourtant, si vous rencontrez le problème pour obtenir le vrai chemin, vous pouvez essayer mes réponses. Les réponses ci-dessus ne m'ont pas aidé.
Explication : - Cette méthode obtient l'URI, puis vérifie le niveau d'API de votre appareil Android après que, selon le niveau d'API, il générera le chemin réel. Le code pour générer la méthode du chemin réel est différent selon les niveaux d'API.
méthode pour obtenir le chemin réel à partir de l'URI
Utilisez cette méthode comme ceci
Production:-
la source
String wholeID = DocumentsContract.getDocumentId(uri);
que j'obtiens:java.lang.RuntimeException: Failure delivering result
J'ai fait comme ça:
la source
Étant donné que managedQuery est obsolète, vous pouvez essayer:
la source
Ici, je vais vous montrer comment créer un bouton BROWSE qui, lorsque vous cliquerez, ouvrira la carte SD, vous sélectionnerez un fichier et, par conséquent, vous obtiendrez le nom de fichier et le chemin d'accès du fichier sélectionné une:
Un bouton que vous frapperez
La fonction qui obtiendra le nom du fichier résultant et le chemin du fichier
la source
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-à-dire/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Des indices?De toute façon pour Android Q passé , quand MediaStore.Images.Media.DATA ne sera plus disponible? Ce champ est déprécié dans Android Q:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Modifié
Pour autant que je sache pour les anciens Android Q, la seule façon est de relayer sur RELATIVE_PATH
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
la source
Version légèrement modifiée de @PercyPercy - elle ne lance pas et renvoie simplement null si quelque chose se passe mal :
la source
Ici vous obtenez le nom du fichier
la source
Simple et facile. Vous pouvez le faire à partir de l'URI comme ci-dessous!
la source
Cette solution fonctionne pour chaque cas:
Dans certains cas, il est trop difficile d'obtenir le chemin à partir de l'URL. Alors pourquoi avez-vous besoin du chemin? Pour copier le fichier ailleurs? Vous n'avez pas besoin du chemin.
la source
Fonctionne parfaitement pour moi le code fixe de ce post :
la source
En tant que module complémentaire, si vous devez voir si un fichier existe avant d'essayer d'ouvrir un flux d'entrée, vous pouvez utiliser DocumentsContract.
(Code Kotlin)
la source
Étant donné que les réponses ci-dessus n'ont pas fonctionné pour moi, voici la solution qui a fonctionné pour moi:
Pour les niveaux d'API> 19 et <= 19.
Cette méthode couvre tous les cas pour obtenir filePath depuis uri
la source
Pour obtenir n'importe quelle sorte de chemin de fichier, utilisez ceci:
la source
Vérifiez ci-dessous la méthode fonctionne aussi très bien Oreo 8.1 ..
Classe de chemin URI:
la source
Je le fais avec une doublure:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Qui dans onActivityResult ressemble à:
la source
Les choses sont compliquées maintenant, surtout après le niveau d'API 29 Android Q.C'est ainsi que vous devriez obtenir le nom de fichier du contenu Uri
et voici comment obtenir le chemin d'accès complet de Content Uri pour toutes les versions Android
la source
Cela fonctionne parfaitement pour moi si la version de votre système est supérieure à 19, j'espère que cela peut vous aider.
la source
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
la source