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