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

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