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