Convertir le fichier: Uri En fichier dans Android

Quel est le moyen le plus simple de convertir à partir d'un file: android.net.Uri à un File Dans Android?

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());
296
demandé sur hippietrail 2010-06-04 18:48:06

15 réponses

Ce que vous voulez est...

new File(uri.getPath());

... et pas...

new File(uri.toString());

NOTE: uri.toString() renvoie une chaîne au format: "file:///mnt/sdcard/myPicture.jpg", alors que uri.getPath() renvoie une chaîne au format: "/mnt/sdcard/myPicture.jpg".

624
répondu Adil Hussain 2018-06-22 16:24:46

Après avoir cherché pendant longtemps, c'est ce qui a fonctionné pour moi:

File file = new File(getPath(uri));


public String getPath(Uri uri) 
    {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor == null) return null;
        int column_index =             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String s=cursor.getString(column_index);
        cursor.close();
        return s;
    }
31
répondu Sanket Berde 2015-03-15 14:51:38

EDIT: Désolé, j'aurais dû tester mieux avant. Cela devrait fonctionner:

new File(new URI(androidURI.toString()));

URI est java. net. URI.

28
répondu Matthew Flaschen 2010-06-04 17:05:05

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.

String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
10
répondu Jacek Kwiecień 2018-01-05 13:03:43

Utiliser

InputStream inputStream = getContentResolver().openInputStream(uri);    

Directement et copiez le fichier. Voir aussi:

Https://developer.android.com/guide/topics/providers/document-provider.html

7
répondu Juan Camilo Rodriguez Durán 2016-07-25 14:39:47

Avec Kotlin, c'est encore plus facile:

val file = File(uri.path)

Ou si vous utilisez extensions Kotlin pour Android :

val file = uri.toFile()
3
répondu Volodymyr Khodonovych 2018-06-07 08:03:43

J'ai fait ceci comme suit:

try {
    readImageInformation(new File(contentUri.getPath()));

} catch (IOException e) {
    readImageInformation(new File(getRealPathFromURI(context,
                contentUri)));
}

public static String getRealPathFromURI(Context context, Uri contentUri) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = context.getContentResolver().query(contentUri, proj,
                null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
}

Donc, fondamentalement, j'essaie d'abord d'utiliser un fichier, c'est-à-dire une photo prise par un appareil photo et enregistrée sur une carte SD. Cela ne fonctionne pas pour l'image renvoyée par: Intention photoPickerIntent = Nouvelle intention ( intention.ACTION_PICK); Dans ce cas, il est nécessaire de convertir L'Uri en chemin réel par la fonction getRealPathFromURI(). Donc, la conclusion est que cela dépend du type D'Uri que vous voulez convertir en Fichier.

1
répondu Kovács Ede 2015-05-09 12:34:11

@CommonsWare a très bien expliqué toutes les choses. Et nous devrions vraiment utiliser la solution qu'il a proposée.

En passant, seules les informations sur lesquelles nous pourrions Compter lors de l'interrogation ContentResolver sont le nom et la taille d'un fichier comme mentionné ici: récupération des informations du fichier / Développeurs Android

Comme 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 d'Envoyer à un serveur. Pour ce faire, j'ai copié un contenu de fichier dans un fichier temporaire en utilisant ContentResolver et openInputStream()

1
répondu Bogdan Kornev 2017-03-09 18:39:23

La Meilleure Solution

Créez une classe Java FileUtil simple et utilisez-la pour créer, copier et renommer le fichier

Je suis utiliser uri.toString() et uri.getPath() mais ne fonctionne pas pour moi. J'ai finalement trouvé cette solution.

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
    private static final int EOF = -1;
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

    private FileUtil() {

    }

    public static File from(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        String fileName = getFileName(context, uri);
        String[] splitName = splitFileName(fileName);
        File tempFile = File.createTempFile(splitName[0], splitName[1]);
        tempFile = rename(tempFile, fileName);
        tempFile.deleteOnExit();
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(tempFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (inputStream != null) {
            copy(inputStream, out);
            inputStream.close();
        }

        if (out != null) {
            out.close();
        }
        return tempFile;
    }

    private static String[] splitFileName(String fileName) {
        String name = fileName;
        String extension = "";
        int i = fileName.lastIndexOf(".");
        if (i != -1) {
            name = fileName.substring(0, i);
            extension = fileName.substring(i);
        }

        return new String[]{name, extension};
    }

    private static String getFileName(Context context, Uri uri) {
        String result = null;
        if (uri.getScheme().equals("content")) {
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            try {
                if (cursor != null && cursor.moveToFirst()) {
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf(File.separator);
            if (cut != -1) {
                result = result.substring(cut + 1);
            }
        }
        return result;
    }

    private static File rename(File file, String newName) {
        File newFile = new File(file.getParent(), newName);
        if (!newFile.equals(file)) {
            if (newFile.exists() && newFile.delete()) {
                Log.d("FileUtil", "Delete old " + newName + " file");
            }
            if (file.renameTo(newFile)) {
                Log.d("FileUtil", "Rename file to " + newName);
            }
        }
        return newFile;
    }

    private static long copy(InputStream input, OutputStream output) throws IOException {
        long count = 0;
        int n;
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
}

Classe utilisateur FileUtil dans votre code

try {
         File file = FileUtil.from(MainActivity.this,fileUri);
         Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());

  } catch (IOException e) {
          e.printStackTrace();
  }
1
répondu vishwajit chauhan 2018-09-25 03:17:52

Vous pouvez obtenir le fichier à partir de L'Uri du fichier en utilisant la méthode suivante. Il a DocumentFile pour le paramètre mais vous pouvez le changer facilement. Le moyen le plus simple de tester cette méthode pour créer un uri de fichier en utilisant DocumentFile.fromFile(Environment.getExternalStorageDirectory()); qui a un Uri file:///storage/emulated/0

/**
         * Gets File from DocumentFile if Uri is file:///
         *
         * @param documentFile Document file that contains Uri to create File from
         * @return File with absolute path to the physical file on device memory
         */

   public static File getFileFromDocumentFile(DocumentFile documentFile) {
        try {
            File file = new File(URI.create(documentFile.getUri().toString()));
            return file;
        } catch (Exception e) {
            return null;
        }
    }

Au lieu de créer des fichiers à partir D'Uri, utilisez DocumentFile.fromTreeUri(Context, Uri) ou DocumentFile.fromSingleri(Context, Uri) pour créer ou supprimer des fichiers et pour les flux, Utilisez getContentResolver().openOutputStream(documentFile.getUri()) et getContentResolver().openInputStream(documentFile.getUri()) pour écrire ou lire des fichiers.

0
répondu Thracian 2017-10-24 08:18:55

Chaîne publique getRealPathFromURI(uri uri) {

    String result;
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor == null) {
        result = uri.getPath();
        cursor.close();
        return result;
    }
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    result = cursor.getString(idx);
    cursor.close();
    return result;
}

Puis en utilisant pour obtenir le fichier de L'URI:

        File finalFile = newFile(getRealPathFromURI(uri));

- L'ESPOIR PEUT VOUS AIDER - - - -

0
répondu Phạm Hùng 2018-03-20 04:56:44

Android + Kotlin

  1. Ajouter une dépendance pour les extensions Android Kotlin:

    implementation 'androidx.core:core-ktx:{latestVersion}'

  2. Récupère le fichier de l'uri:

    uri.toFile()

Android + Java

Il suffit de passer en haut ;)

0
répondu Hemant Kaushik 2018-05-25 06:23:29

Par le code suivant, je suis en mesure d'obtenir le fichier PDF partagé de l'application adobe en tant que flux et d'enregistrer dans le chemin de l'application android

Android.Net.Uri fileuri =
    (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);

    fileuri i am getting as {content://com.adobe.reader.fileprovider/root_external/
                                        data/data/com.adobe.reader/files/Downloads/sample.pdf}

    string filePath = fileuri.Path;

   filePath I am gettings as root_external/data/data/com.adobe.reader/files/Download/sample.pdf

      using (var stream = ContentResolver.OpenInputStream(fileuri))
      {
       byte[] fileByteArray = ToByteArray(stream); //only once you can read bytes from stream second time onwards it has zero bytes

       string fileDestinationPath ="<path of your destination> "
       convertByteArrayToPDF(fileByteArray, fileDestinationPath);//here pdf copied to your destination path
       }
     public static byte[] ToByteArray(Stream stream)
        {
            var bytes = new List<byte>();

            int b;
            while ((b = stream.ReadByte()) != -1)
                bytes.Add((byte)b);

            return bytes.ToArray();
        }

      public static string convertByteArrayToPDF(byte[] pdfByteArray, string filePath)
        {

            try
            {
                Java.IO.File data = new Java.IO.File(filePath);
                Java.IO.OutputStream outPut = new Java.IO.FileOutputStream(data);
                outPut.Write(pdfByteArray);
                return data.AbsolutePath;

            }
            catch (System.Exception ex)
            {
                return string.Empty;
            }
        }
0
répondu NagendraBabu 2018-08-31 16:18:22

Pour les gens qui sont ici à la recherche d'une solution pour les images en particulier, c'est ici.

private Bitmap getBitmapFromUri(Uri contentUri) {
        String path = null;
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
        if (cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            path = cursor.getString(columnIndex);
        }
        cursor.close();
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        return bitmap;
    }
-1
répondu SARose 2014-03-22 18:23:18

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: / / / storage / emulated / 0 / (un répertoire et un nom de fichier)

-1
répondu Sayooj 2015-02-28 00:31:38