Получение информации о файле

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

Для получения дополнительной информации см.: