Prima che un'app client provi a utilizzare un file per il quale presenta un URI del contenuto, l'app può richiedere informazioni sul file all'app server, inclusi il tipo di dati e le dimensioni del file. Il tipo di dati consente all'app client di determinare se è in grado di gestire il file, mentre le dimensioni del file aiutano l'app client a configurare il buffering e la memorizzazione nella cache per il file.
Questa lezione mostra come eseguire query su FileProvider
dell'app server per recuperare il tipo e le dimensioni MIME di un file.
Recuperare il tipo MIME di un file
Il tipo di dati di un file indica all'app client come deve gestire i contenuti del file. Per ottenere
il tipo di dati di un file condiviso in base all'URI dei contenuti, l'app client chiama
ContentResolver.getType()
. Questo metodo restituisce il tipo MIME del file. Per impostazione predefinita, un elemento
FileProvider
determina il tipo MIME del file dall'estensione
del nome file.
Il seguente snippet di codice mostra in che modo un'app client recupera il tipo MIME di un file dopo che l'app server ha restituito l'URI dei contenuti al 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); ...
Recuperare il nome e le dimensioni di un file
La classe FileProvider
ha un'implementazione predefinita del metodo query()
che restituisce il nome e le dimensioni del file associato a un URI di contenuti in un Cursor
. L'implementazione predefinita restituisce due colonne:
DISPLAY_NAME
-
Il nome del file, indicato come
String
. Questo valore è uguale al valore restituito daFile.getName()
. SIZE
-
La dimensione del file in byte, espressa come
long
. Questo valore è uguale al valore restituito daFile.length()
L'app client può recuperare sia DISPLAY_NAME
sia SIZE
di un file impostando tutti
gli argomenti di query()
su
null
, ad eccezione dell'URI del contenuto. Ad esempio, questo snippet di codice recupera
DISPLAY_NAME
e
SIZE
di un file e mostra ogni elemento in
TextView
separati:
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))); ...
Per ulteriori informazioni correlate, consulta: