Передача файла

Теперь, когда вы указали общие файлы, ваше приложение может обрабатывать запросы от других приложений. Одним из способов реагировать на запросы, является создание интерфейса выбора файла, который смогут вызывать другие приложения. Такой подход позволяет пользователю выбрать файл, а затем получить этот файл через его URI.

В данном уроке мы создадим явление выбора файла, которое позволит отвечать на запросы файлов от других приложений.

Получение запроса на файл

Для получения запроса файла от клиентского приложения и отправки ему URI, ваше приложение должно содержать явление выбора файла. Клиентское приложение запустит это явление с помощью метода startActivityForResult(), передав в него намерение с действием ACTION_PICK. Ваше приложение может вернуть результат клиентскому приложению в виде URI файла, который пользователь выберет.

Подробную информацию о запросах файлов в клиентском приложении смотрите в уроке Запрос общего файла.

Создание явления выбора файла

Чтобы создать явление выбора файл, сначала опишите явление в манифесте, включив в описание фильтр намерения с действием ACTION_PICK и категориями CATEGORY_DEFAULT и CATEGORY_OPENABLE. Добавьте также MIME типы для файлов вашего приложения. Далее приведен пример описания такого явления:

Программное создание явления выбора файла

Далее описан подкласс Activity, показывающий доступные файлы из директории files/images/ внутреннего хранилища и позволяющий пользователям выбрать необходимый файл:

Обработчик выбора файла

При выборе файла, ваше приложение должно определить что за файл был выбран и сгенерировать для него URI. Явление показывает список доступных файлов с помощью компонента ListView. При клике по названию файла система вызывает метод onItemClick(), в котором можно получить выбранный файл.

В методе onItemClick() получим объект типа File и передадим в качестве аргумента в метод getUriForFile() вместе с authority, который мы указали ранее в элементе <provider>. В результате мы получим URI, содержащий authority, путь до каталога и имя файла с расширением. Как класс FileProvider размечает директории и вычисляет для них пути на основе мета-данных из XML, мы рассмотрели в предыдущем уроке.

Следующий кусок кода показывает как вычислить какой файл выбран и получить для него URI:

Помните, что вы можете сгенерировать URI только для файлов из директории, указанной в мета-данных с помощью элемента <paths>. Об этом мы говорили в предыдущем уроке. Если вы попытаетесь получить URI для файла из других каталогов, то получите исключение IllegalArgumentException.

Выдача разрешения на файл

После получения URI необходимо выдать разрешение на доступ к этому файлу приложению, которое его запросило. Для этого нужно передать URI в намерение, а затем установить в намерении разрешающие флаги. Выданное разрешение будет временным и автоматически отменится после обработки файла другим приложением.

Выдать разрешение на чтение можно следующим образом:

Внимание: использование метода setFlags() это единственный безопасный способ выдать временное разрешение. Избегайте использования метода Context.grantUriPermission() для файловых URI, поскольку права будут выданы до тех пор, пока вы не отмените их с помощью метода Context.revokeUriPermission().

Делимся файлами с приложениями

Чтобы поделиться файлом с приложением, которое этот файл запросило, передайте намерение, включающее URI файла и разрешение в метод setResult(). После завершения вашего явления, оно передаст это намерение в клиентское приложение. Можно сделать так:

Дайте пользователям возможность немедленно вернуться в клиентское приложение, как только они выбрали файл. Можно например добавить кнопку “готово”. При нажатии кнопки вызывайте метод finish(). Например:

Добавить комментарий