При создании намерения необходимо указать действие, которое намерение “вызывает”. Android определяет ряд действий, в том числе ACTION_SEND
которое, как вы можете догадаться, указывает на то, что интент передает данные из одной активити в другую, даже через границы процессов. Для передачи данных в другую активити, все, что вам нужно сделать, это указать данные и их тип, система определит совместимые принимающие активити, и отобразит их пользователю (если есть несколько вариантов) или немедленно запустит активити (если есть только один вариант). Подобным образом, вы можете объявить типы данных, прием которых ваша активити поддерживает из других приложений, указав их в своем манифесте.
Передача и прием данных между приложениями с помощью интентов чаще всего используется в приложениях социальных сетей для публикации контента. Интенты позволяют пользователям обмениваться информацией быстро и легко, используя свои любимые приложения.
Примечание: Лучшим способом добавить элемент для обмена данными в ActionBar
является использование ShareActionProvider
, который стал доступен в уровне API 14. ShareActionProvider
обсуждается в уроке Добавление простого обмена данными.
[wpanchor id=”1″]
Отправка текстовых данных в android
Самый простой и распространенный способ использования действия 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[])
для их добавления к вашим интентам.
[wpanchor id=”2″]
Отправка двоичных данных в android
Бинарные данные передаются с помощью действия 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
доступен любому приложению на устройстве.
- Хранить данные в своём собственном
[wpanchor id=”3″]
Как отправить несколько единиц контента в android
Чтобы поделиться несколькими единицами контента, используйте действие 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
указывают на данные, к которым принимающее приложение может получить доступ.