Récupérer des informations sur un fichier

Avant qu'une application cliente ne tente de fonctionner avec un fichier pour lequel elle possède un URI de contenu, elle peut demander des informations sur le fichier à partir de l'application de serveur, y compris le type de données du fichier et la taille du fichier. Le type de données permet à l'application cliente de déterminer si elle peut gérer le fichier. aide l'application cliente à configurer la mise en mémoire tampon et la mise en cache du fichier.

Cette leçon explique comment interroger le serveur FileProvider pour récupérer le type et la taille MIME d'un fichier.

Récupérer le type MIME d'un fichier

Le type de données d'un fichier indique à l'application cliente comment elle doit gérer le contenu du fichier. Pour obtenir le type de données d'un fichier partagé en fonction de son URI de contenu, l'application cliente appelle ContentResolver.getType() Cette méthode renvoie le type MIME du fichier. Par défaut, FileProvider détermine le type MIME du fichier à partir de ses nom de fichier.

L'extrait de code suivant montre comment une application cliente récupère le type MIME d'un fichier une seule fois. l'application du serveur a renvoyé l'URI de contenu au client:

Kotlin

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    val mimeType: String? = returnIntent.data?.let { returnUri ->
        contentResolver.getType(returnUri)
    }
    ...

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    Uri returnUri = returnIntent.getData();
    String mimeType = getContentResolver().getType(returnUri);
    ...

Récupérer le nom et la taille d'un fichier

La classe FileProvider dispose d'une implémentation par défaut de la classe query() qui renvoie nom et la taille du fichier associé à un URI de contenu dans une Cursor L'implémentation par défaut renvoie deux colonnes:

DISPLAY_NAME
Nom du fichier, en tant que String. Cette valeur est identique à celle renvoyée d'ici le File.getName().
SIZE
Taille du fichier en octets, sous forme de long. Cette valeur est identique à la valeur renvoyé par File.length()
.

L'application cliente peut obtenir à la fois les DISPLAY_NAME et les SIZE d'un fichier en définissant tous des arguments de query() pour null, à l'exception de l'URI de contenu. Par exemple, cet extrait de code récupère le fichier DISPLAY_NAME et SIZE, et affiche chacune d'elles dans des TextView:

Kotlin

    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    returnIntent.data?.let { returnUri ->
        contentResolver.query(returnUri, null, null, null, null)
    }?.use { cursor ->
        /*
         * Get the column indexes of the data in the Cursor,
         * move to the first row in the Cursor, get the data,
         * and display it.
         */
        val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
        cursor.moveToFirst()
        findViewById<TextView>(R.id.filename_text).text = cursor.getString(nameIndex)
        findViewById<TextView>(R.id.filesize_text).text = cursor.getLong(sizeIndex).toString()
        ...
    }

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    Uri returnUri = returnIntent.getData();
    Cursor returnCursor =
            getContentResolver().query(returnUri, 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,
     * and display it.
     */
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    TextView nameView = (TextView) findViewById(R.id.filename_text);
    TextView sizeView = (TextView) findViewById(R.id.filesize_text);
    nameView.setText(returnCursor.getString(nameIndex));
    sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
    ...

Pour en savoir plus, consultez les ressources suivantes: