Como recuperar informações de um arquivo

Antes de um app cliente tentar trabalhar com um arquivo para o qual tem um URI de conteúdo, ele pode solicitar informações sobre o arquivo no app do servidor, incluindo o tipo de dados e o tamanho do arquivo. O tipo de dados ajuda o app cliente a determinar se ele pode processar o arquivo, e o 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 o FileProvider do app do servidor para recuperar 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 ver o tipo de dados 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 a partir da extensão do nome de arquivo.

O snippet de código a seguir demonstra como um app cliente recupera o tipo MIME de um arquivo depois que o app do servidor retorna 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 o 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 String. Esse valor é igual ao retornado por File.getName().
SIZE
O tamanho do arquivo em bytes, como um long. Esse valor é o mesmo que o valor retornado por File.length()

O app cliente pode receber o DISPLAY_NAME e o SIZE de um arquivo definindo todos os argumentos de query() como null, exceto o URI de conteúdo. Por exemplo, este snippet de código recupera o DISPLAY_NAME e o SIZE de um arquivo e exibe cada um em TextView separados:

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: