Recupero delle informazioni sui file in corso...

Prima che un'app client tenti di lavorare con un file per il quale ha un URI dei contenuti, l'app può richiedere informazioni sul file dall'app server, tra cui il tipo di dati e dimensioni del file. Il tipo di dati consente all'app client di determinare se è in grado di gestire il file, la dimensione del file consente all'app client di impostare il buffering e la memorizzazione nella cache per il file.

Questa lezione mostra come eseguire query FileProvider 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, dato l'URI dei contenuti, l'app client chiama ContentResolver.getType(). Questo metodo restituisce il tipo MIME del file. Per impostazione predefinita, FileProvider determina il tipo MIME del file in base alla sua del nome file.

Il seguente snippet di codice mostra come un'app client recupera una volta il tipo MIME di un file 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);
    ...

Recupera il nome e le dimensioni di un file

La classe FileProvider ha un'implementazione predefinita query() che restituisce il metodo nome e dimensione del file associato a un URI dei 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 entro il giorno File.getName().
SIZE
La dimensione del file in byte, espressa come long. Questo valore corrisponde al valore restituito da File.length()

L'app client può ricevere sia DISPLAY_NAME sia SIZE per un file impostando tutti degli argomenti di query() null tranne l'URI dei contenuti. Ad esempio, questo snippet di codice recupera le DISPLAY_NAME e SIZE e li mostra in due 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)));
    ...

Per ulteriori informazioni correlate, consulta: