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

 

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

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

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

[wpanchor id=”1″]

 

Отправка текстовых данных в android


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

Рисунок 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[]) для их добавления к вашим интентам.

[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 указывают на данные, к которым принимающее приложение может получить доступ.

Далее: Получение простых данных из других android приложений

Додати коментар