Como recuperar informações de um arquivo

Antes de um aplicativo cliente tentar trabalhar com um arquivo para o qual tenha um URI de conteúdo, o aplicativo pode solicitar informações sobre o arquivo a partir do aplicativo do servidor, incluindo o tipo de dados do arquivo e tamanho do arquivo. O tipo de dados ajuda o aplicativo cliente a determinar se pode lidar com o arquivo, e a tamanho do arquivo ajuda o app cliente a configurar o armazenamento em buffer e o armazenamento em cache do arquivo.

Esta lição demonstra como consultar a classe FileProvider para extrair o tipo e o tamanho MIME de um arquivo.

Recuperar o tipo MIME de um arquivo

O tipo de dado de um arquivo indica ao app do cliente como gerenciar o conteúdo do arquivo. Para receber o tipo de dado de um arquivo compartilhado conforme o URI de conteúdo, o app cliente chama ContentResolver.getType(): Esse método retorna o tipo MIME do arquivo. Por padrão, um FileProvider determina o tipo MIME do arquivo pela extensão de nome de arquivo.

O snippet de código a seguir demonstra como um app cliente recupera o tipo MIME de um arquivo uma vez. o app do servidor retornou o URI de conteúdo ao cliente:

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);
    ...

Recuperar o nome e o tamanho de um arquivo

A classe FileProvider tem uma implementação padrão do método query() que retorna o nome e tamanho do arquivo associado a um URI de conteúdo em um Cursor A implementação padrão retorna duas colunas:

DISPLAY_NAME
O nome do arquivo, como um String. Esse valor é igual ao retornado por File.getName().
SIZE
O tamanho do arquivo em bytes, como um long. Esse valor é igual ao valor retornado por File.length()

O app cliente pode receber o DISPLAY_NAME e o SIZE de um arquivo definindo todas as dos argumentos de query() para null, exceto pelo URI de conteúdo. Por exemplo, este snippet de código recupera o código DISPLAY_NAME e SIZE e exibe cada um em um 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)));
    ...

Para ver outras informações relacionadas, consulte: