Прежде чем клиентское приложение попытается работать с файлом, для которого у него есть 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))); ...
Для получения дополнительной информации см.: