Recupero delle informazioni sui file in corso...

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 da File.getName().
SIZE
La dimensione del file in byte, espressa come long. Questo valore è uguale al valore restituito da File.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: