Récupérer des informations sur un fichier

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

Cette leçon explique comment interroger le FileProvider de l'application serveur 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 son extension.

L'extrait de code suivant montre comment une application cliente récupère le type MIME d'un fichier une fois que l'application de 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 méthode query(), qui renvoie le nom et la taille du fichier associé à un URI de contenu dans un élément 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 par File.getName().
SIZE
Taille du fichier en octets, au format long. Cette valeur est identique à la valeur renvoyée par File.length().

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

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: