Прежде чем клиентское приложение попытается работать с файлом, для которого у него есть URI контента, приложение может запросить информацию о файле у серверного приложения, включая тип данных и размер файла. Тип данных помогает клиентскому приложению определить, может ли оно обработать файл, а размер файла помогает клиентскому приложению настроить буферизацию и кэширование для файла.
В этом уроке показано, как запросить FileProvider
серверного приложения, чтобы получить тип и размер MIME файла.
Получить MIME-тип файла
Тип данных файла указывает клиентскому приложению, как оно должно обрабатывать содержимое файла. Чтобы получить тип данных общего файла с учетом URI его содержимого, клиентское приложение вызывает ContentResolver.getType()
. Этот метод возвращает MIME-тип файла. По умолчанию FileProvider
определяет MIME-тип файла по расширению его имени.
В следующем фрагменте кода показано, как клиентское приложение получает MIME-тип файла после того, как серверное приложение вернуло клиенту URI содержимого:
Котлин
... /* * 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) } ...
Ява
... /* * 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); ...
Получить имя и размер файла
Класс FileProvider
имеет реализацию по умолчанию метода query()
, который возвращает имя и размер файла, связанного с URI контента в Cursor
. Реализация по умолчанию возвращает два столбца:
-
DISPLAY_NAME
- Имя файла в виде
String
. Это значение совпадает со значением, возвращаемымFile.getName()
. -
SIZE
- Размер файла в байтах, как
long
Это значение совпадает со значением, возвращаемымFile.length()
Клиентское приложение может получить как DISPLAY_NAME
, так и SIZE
для файла, установив для всех аргументов query()
значение null
за исключением URI контента. Например, этот фрагмент кода извлекает DISPLAY_NAME
и SIZE
файла и отображает каждый из них в отдельном TextView
:
Котлин
/* * 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() ... }
Ява
... /* * 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))); ...
Для получения дополнительной информации см.: