Como recuperar informações de arquivos

Antes de um app de cliente tentar trabalhar com um arquivo para o qual tenha um URI de conteúdo, ele pode solicitar informações sobre o arquivo no app do servidor, incluindo o tipo de dado e o tamanho do arquivo. O tipo de dado ajuda o app do cliente a determinar se ele pode gerenciar 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 tamanho e o tipo 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 dado de um arquivo compartilhado conforme o URI de conteúdo dele, o app do 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 de cliente recupera o tipo MIME de um arquivo depois que o app de 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 com um URI de conteúdo em um Cursor. A implementação padrão retorna duas colunas:

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

O app do cliente pode receber tanto o DISPLAY_NAME quanto o SIZE de um arquivo definindo todos os argumentos de query() como null, exceto pelo 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 deles em TextView separadas:

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 mais informações relacionadas, consulte: