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 leFile.getName()
. SIZE
-
Taille du fichier en octets, sous forme de
long
. Cette valeur est identique à la valeur renvoyé parFile.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: