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 porFile.getName()
. SIZE
-
O tamanho do arquivo em bytes, como um
long
. Esse valor é igual ao valor retornado porFile.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: