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

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

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

Примечание: Лучшим способом добавить элемент для обмена данными в ActionBar является использование ShareActionProvider, который стал доступен в уровне API 14. ShareActionProvider обсуждается в уроке Добавление простого обмена данными.

Отправка текстового содержимого

Рисунок 1. Скриншот ACTION_SEND намерения, открывшего диалог выбора на телефоне.

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

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);

Если есть установленное приложение с фильтром, который соответствует ACTION_SEND и MIME типу text/plain, Android система выполнит его; если более одного приложения соответствует критериям, система выведет диалоговое окно для разрешения противоречий ("диалог выбора"), которое позволяет пользователю выбрать приложение.

Тем не менее, если вы вызовите Intent.createChooser(), передав в него ваш Intent объект, он возвращает версию вашего намерения, которое будет всегда отображать диалог выбора. Это имеет несколько преимуществ:

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

Вот обновленный код:

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

Появившийся диалог показан на рисунке 1.

Опционально, вы можете установить некоторые стандартные дополнительные параметры для намерений: EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT. Если принимающее приложение не предназначено для их использования, оно просто игнорирует их.

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

Отправка бинарного содержимого

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

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

Обратите внимание на следующее:

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

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

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

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share images to.."));

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