155 votes

Comment extraire le nom du fichier de l'URI renvoyé par Intent.ACTION_GET_CONTENT ?

J'utilise un gestionnaire de fichiers tiers pour sélectionner un fichier (PDF dans mon cas) dans le système de fichiers.

C'est ainsi que je lance l'activité :

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);

String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);

startActivityForResult(chooser, ActivityRequests.BROWSE);

Voici ce que j'ai en onActivityResult :

Uri uri = data.getData();
if (uri != null) {
    if (uri.toString().startsWith("file:")) {
        fileName = uri.getPath();
    } else { // uri.startsWith("content:")

        Cursor c = getContentResolver().query(uri, null, null, null, null);

        if (c != null && c.moveToFirst()) {

            int id = c.getColumnIndex(Images.Media.DATA);
            if (id != -1) {
                fileName = c.getString(id);
            }
        }
    }
}

L'extrait de code est emprunté à Ouvrir le gestionnaire de fichiers Intents sont disponibles ici :
http://www.openintents.org/en/node/829

L'objectif de la if-else est la compatibilité ascendante. Je me demande si c'est la meilleure façon d'obtenir le nom du fichier, car j'ai constaté que d'autres gestionnaires de fichiers renvoient toutes sortes de choses.

Par exemple, Documents ToGo renvoie quelque chose comme ce qui suit :

content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf

sur lequel getContentResolver().query() retours null .

Pour rendre les choses plus intéressantes, le gestionnaire de fichiers sans nom (j'ai obtenu cet URI à partir du journal du client) a renvoyé quelque chose comme :

/./sdcard/downloads/.bin

Existe-t-il un moyen privilégié d'extraire le nom du fichier à partir de l'URI ou faut-il recourir à l'analyse des chaînes de caractères ?

2voto

WhiteVulpes Points 21

Que pensez-vous de ceci ?

 Uri uri = result.getData().getClipData().getItemAt(i).getUri();
 uri = Uri.parse(uri.getLastPathSegment());
 System.out.println(uri.getLastPathSegment());

Ceci permet d'imprimer le nom du fichier avec l'extension

1voto

user5233139 Points 29
String Fpath = getPath(this, uri) ;
File file = new File(Fpath);
String filename = file.getName();

1voto

RenatoI Points 1

Ma version de la réponse est en fait très similaire à celle de @Stefan Haustein. J'ai trouvé la réponse sur la page Android Developer Récupération d'informations sur les fichiers ; l'information ici est encore plus condensée sur ce sujet spécifique que sur le site de la Cadre d'accès au stockage site du guide. Dans le résultat de la requête, l'index de la colonne contenant le nom du fichier est OpenableColumns.DISPLAY_NAME . Aucune des autres réponses/solutions pour les index de colonnes n'a fonctionné pour moi. Voici l'exemple de fonction :

 /**
 * @param uri uri of file.
 * @param contentResolver access to server app.
 * @return the name of the file.
 */
def extractFileName(uri: Uri, contentResolver: ContentResolver): Option[String] = {

    var fileName: Option[String] = None
    if (uri.getScheme.equals("file")) {

        fileName = Option(uri.getLastPathSegment)
    } else if (uri.getScheme.equals("content")) {

        var cursor: Cursor = null
        try {

            // Query the server app to get the file's display name and size.
            cursor = contentResolver.query(uri, null, null, null, null)

            // Get the column indexes of the data in the Cursor,
            // move to the first row in the Cursor, get the data.
            if (cursor != null && cursor.moveToFirst()) {

                val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
                fileName = Option(cursor.getString(nameIndex))
            }

        } finally {

            if (cursor != null) {
                cursor.close()
            }

        }

    }

    fileName
}

1voto

Ayaz Points 58

Tout d'abord, vous devez convertir votre URI à l'objet URL et utiliser ensuite l'objet File pour récupérer un nom de fichier :

try
    {
        URL videoUrl = uri.toURL();
        File tempFile = new File(videoUrl.getFile());
        String fileName = tempFile.getName();
    }
    catch (Exception e)
    {

    }

Voilà, c'est très simple.

1voto

Stefan Michev Points 131

Fonction Stefan Haustein pour xamarin/c# :

public string GetFilenameFromURI(Android.Net.Uri uri)
        {
            string result = null;
            if (uri.Scheme == "content")
            {
                using (var cursor = Application.Context.ContentResolver.Query(uri, null, null, null, null))
                {
                    try
                    {
                        if (cursor != null && cursor.MoveToFirst())
                        {
                            result = cursor.GetString(cursor.GetColumnIndex(OpenableColumns.DisplayName));
                        }
                    }
                    finally
                    {
                        cursor.Close();
                    }
                }
            }
            if (result == null)
            {
                result = uri.Path;
                int cut = result.LastIndexOf('/');
                if (cut != -1)
                {
                    result = result.Substring(cut + 1);
                }
            }
            return result;
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X