Отправка простых данных другим приложениям

Если вы создаете намерение, вы должны указать на какие действия ваше намерение отзывается. Android предоставляет набор стандартных действий, включая ACTION_SEND, которое указывает, как вы могли догадаться, на то, что одно явление передает данные другому. Для передачи данных другому явлению, необходимо указать сами данные и их тип. Система найдет явления, совместимые с данными, и отобразит их пользователю (если их несколько) или сразу запустит (если оно одно). Таким же образом, вы можете объявить типы данных, которые может принять ваше явление от других приложений, указав их в файле манифеста.

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

Примечание: для размещения кнопки “поделиться” на панель инструментов лучше всего использовать класс ShareActionProvider, который появился в API 14. О данном классе рассказано в уроке Простое добавление шаринга.

Отправка текста

пример выбора приложения для шаринга

Рисунок 1. Пример выбора приложения для выполнения действия ACTION_SEND.

Наиболее часто ACTION_SEND используется для передачи текста из одного явления в другое. Например, браузер может передать адрес текущей страницы в виде текста любому другому приложению. Удобно использовать такой механизм, чтобы поделиться статьей или сайтом с друзьями, отправив им письмо или сообщение в социальной сети. Вот пример расшаривания данных:

Если существует приложение, в котором описан фильтр намерения для действия ACTION_SEND и с MIME типов text/plain, система может его запустить. Если таких приложений несколько, система покажет диалог выбора (chooser), в котором приложение должен выбрать пользователь.

Однако, если вы передадите в метод Intent.createChooser() объект намерения типа Intent, это намерение всегда будет показывать диалог выбора. Есть некоторые преимущества такого подхода:

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

Пример:

Результат показан на рисунке 1.

При желании, вы можете использовать любые стандартные расширения для намерений: EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT. Если приложение их не поддерживает, то они будут проигнорированы.

Примечание: Некоторые e-mail приложения, например Gmail, требуют массив строк String[] для расширений, вроде EXTRA_EMAIL и EXTRA_CC. Используйте метод putExtra(String, String[]), чтобы добавить их в ваше намерение.

Передача бинарных данных

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

Помните следующее:

  • Вы можете использовать MIME тип "*/*", но это подходит только для явлений, которые обрабатывают общие потоки данных.
  • Приложениям, получающим данные, требуется получить разрешение для доступа к данным по Uri. Рекомендуемые способы получения разрешений:
    • Храните данные в ваших собственных поставщиках контента, объектах типа ContentProvider и убедитесь в том, что другие приложения имеют права на доступ к вашему поставщику. Чаще всего для предоставления доступа используется механизм, который заключается в использовании временных прав для URI, которые обеспечивают доступ только для получающего приложения. Самый простой способ создать поставщика контента – это использовать класс помощника FileProvider.
    • Используйте класс MediaStore. Класс MediaStore появился в Android 3.0 (API 11) и нацелен на работу в первую очередь с видео, аудио и картинками, однако может работать и с другими не медийными типами (смотрите подробности о MediaStore.Files). Файлы могут быть добавлены к объекту MediaStore с помощью метода scanFile(), после чего URI content:// может быть совместно использоваться и передаваться в метод обратного вызова onScanCompleted(). Помните, что при добавлении в MediaStore, данные становятся общедоступными для любого приложения на устройстве.

Отправка нескольких частей данных

Чтобы отправить несколько частей данных, используйте действие ACTION_SEND_MULTIPLE совместно со списком URI-указателей. MIME тип может меняться в зависимости от данных. Например, если вы передаете 3 JPEG картинки, тип будет "images/jpeg". Для смеси различных типов картинок, тип должен быть "image/*". Если вы передаете данные с большим количеством разных типов, необходимо использовать "*/*". Как отмечалось ранее, это нужно для принимающего приложения, чтобы оно корректно обработало полученные данные. Пример:

И еще раз, убедитесь, что принимающее приложение имеет доступ к переданным URI.

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