Quel est le moyen le plus simple de convertir un file:
android.net.Uri
en un File
dans Android?
J'ai essayé ce qui suit mais cela ne fonctionne pas:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Réponses:
Ce que tu veux c'est ...
... et pas...
REMARQUE:
uri.toString()
renvoie une chaîne au format:"file:///mnt/sdcard/myPicture.jpg"
alors queuri.getPath()
renvoie une chaîne au format:"/mnt/sdcard/myPicture.jpg"
.la source
toString
-il?url.toString()
retourne une chaîne au format suivant: "fichier: ///mnt/sdcard/myPicture.jpg", tandis queurl.getPath()
renvoie une chaîne au format suivant: "/mnt/sdcard/myPicture.jpg", c'est-à-dire sans le type de schéma pré- fixé.open failed: ENOENT (No such file or directory)
lorsque j'essaie d'ouvrir le fichier fourni avec cela. De plus, si l'URI est l'URI de contenu d'une image par exemple, cela ne fonctionne certainement pas.Après avoir longtemps cherché, c'est ce qui a fonctionné pour moi:
la source
managedQuery
est désormais obsolète. utiliser à lagetContentResolver().query(...)
place, qui fonctionne sur API 11+. Ajouter une conditionnelle pour les appareils plus anciens que l'API 11.utilisation
directement et copiez le fichier. Regarde aussi:
https://developer.android.com/guide/topics/providers/document-provider.html
la source
EDIT: Désolé, j'aurais dû mieux tester avant. Cela devrait fonctionner:
L'URI est java.net.URI.
la source
androidURI
est un android.net.Uri. java.net.URI (qui existe sur Android) n'est utilisé que dans le cadre du processus de conversion.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
exception après avoir utilisé cette méthode.Meilleure solution
Créez une classe FileUtil simple et utilisez-la pour créer, copier et renommer le fichier
Je l'utilise
uri.toString()
eturi.getPath()
ne travaille pas pour moi. J'ai finalement trouvé cette solution.Utilisez la classe FileUtil dans votre code
la source
Rien de tout cela ne fonctionne pour moi. J'ai trouvé que c'était la solution de travail. Mais mon cas est spécifique aux images .
la source
Android + Kotlin
Ajouter une dépendance pour les extensions Kotlin Android:
implementation 'androidx.core:core-ktx:{latestVersion}'
Récupérer le fichier depuis uri:
uri.toFile()
Android + Java
Déplacez-vous en haut;)
la source
file
Avec Kotlin, c'est encore plus simple:
Ou si vous utilisez des extensions Kotlin pour Android :
la source
@CommonsWare a bien expliqué tout. Et nous devons vraiment utiliser la solution qu'il a proposée.
Soit dit en passant, seules les informations sur lesquelles nous pouvions compter lors de la requête
ContentResolver
sont le nom et la taille d'un fichier, comme indiqué ici: Récupération des informations sur le fichier | Développeurs AndroidComme vous pouvez le voir, il existe une interface
OpenableColumns
qui ne contient que deux champs: DISPLAY_NAME et SIZE.Dans mon cas, j'avais besoin de récupérer des informations EXIF sur une image JPEG et de la faire pivoter si nécessaire avant de l'envoyer à un serveur. Pour ce faire, j'ai copié un contenu de fichier dans un fichier temporaire en utilisant
ContentResolver
etopenInputStream()
la source
J'ai fait cela comme suit:
Donc, fondamentalement, j'essaie d'abord d'utiliser un fichier, c'est-à-dire une photo prise par l'appareil photo et enregistrée sur la carte SD. Cela ne fonctionne pas pour l'image renvoyée par: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); Dans ce cas, il est nécessaire de convertir Uri en chemin réel par
getRealPathFromURI()
fonction. Donc, la conclusion est que cela dépend du type d'Uri que vous souhaitez convertir en fichier.la source
Si vous en avez un
Uri
qui est conforme à la,DocumentContract
vous ne voudrez probablement pas l'utiliserFile
. Si vous êtes sur kotlin, utilisezDocumentFile
pour faire des choses que vous utiliseriez dans l'ancien mondeFile
et utilisezContentResolver
pour obtenir des flux.Tout le reste est à peu près garanti de casser.
la source
Pour ce cas, en particulier sur Android, le chemin pour les octets est généralement plus rapide.
Avec cela, je l'ai résolu en créant une classe
FileHelper
qui est chargée de gérer la lecture / écriture d'octets de / vers un fichier via le flux et une classeUriHelper
qui est chargée de déterminer le chemin de Uri et l'autorisation.Pour autant qu'il le sache généralement,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
peut nous aider à transférer la chaîne que vous souhaitez vers les octets dont vous avez besoin.Comment laisser UriHelper et FileHelper pour copier une image notée par Uri dans un fichier, vous pouvez exécuter:
à propos de mon UriHelper:
}
à propos de mon FileHelper:
}
la source
Pour les personnes qui recherchent ici une solution pour les images en particulier, la voici.
la source
Fichier imageToUpload = nouveau fichier (nouvel URI (androidURI.toString ())); fonctionne s'il s'agit d'un fichier que vous avez créé dans le stockage externe.
Par exemple, fichier: /// stockage / émulé / 0 / (certains répertoire et nom de fichier)
la source
public String getRealPathFromURI (Uri uri) {
Ensuite, utilisez pour obtenir le fichier de l'URI:
- L'ESPOIR PEUT VOUS AIDER ----
la source
Par le code suivant, je peux obtenir le fichier pdf partagé d'application Adobe en tant que flux et enregistrer dans le chemin de l'application Android
la source
Base d'extension sur @Jacek Kwiecień réponse pour convertir l'URI de l' image en fichier
Si nous utilisons
File(uri.getPath())
, cela ne fonctionnera pasSi nous utilisons l'extension à partir d' Android-ktx , cela ne fonctionne toujours pas trop car https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
la source
DATA
colonne (et c'était une approche peu fiable en premier lieu).Ajouter
onActivityResult
, obtenir un fichier docx ou pdfla source