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