Android использует намерения и связанные с ними дополнения, чтобы пользователи могли быстро и легко обмениваться информацией с помощью своих любимых приложений.
Android предоставляет пользователям два способа обмена данными между приложениями:
- Android Sharesheet в первую очередь предназначен для отправки контента за пределы вашего приложения и/или напрямую другому пользователю. Например, поделиться URL-адресом с другом.
- Android Intent resolver лучше всего подходит для передачи данных на следующий этап четко определенной задачи. Например, открытие PDF-файла из вашего приложения и предоставление пользователям возможности выбрать предпочитаемое средство просмотра.
Когда вы создаете намерение, вы указываете действие, которое намерение должно выполнить. Android использует действие ACTION_SEND
для отправки данных из одной активности в другую, даже через границы процесса. Вам необходимо указать данные и их тип. Система автоматически определяет совместимые активности, которые могут получать данные, и отображает их пользователю. В случае с распознавателем намерений, если только одна активность может обработать намерение, эта активность немедленно запускается.
Зачем использовать Android Sharesheet

Мы настоятельно рекомендуем использовать Android Sharesheet для создания согласованности для пользователей в разных приложениях. Не отображайте собственный список целей для обмена вашего приложения и не создавайте собственные вариации Sharesheet.
Android Sharesheet позволяет пользователям делиться информацией с нужным человеком, предлагая соответствующие приложения, и все это одним нажатием. Sharesheet может предлагать цели, недоступные для пользовательских решений, и использует последовательный рейтинг. Это связано с тем, что Sharesheet может учитывать информацию о приложении и активности пользователя, которая доступна только системе.
Android Sharesheet также имеет множество удобных функций для разработчиков. Например, вы можете сделать следующее:
- Узнайте, когда ваши пользователи завершают обмен и куда
- Добавьте пользовательский
ChooserTarget
и цели приложения - Обеспечивать предварительный просмотр содержимого в формате расширенного текста, начиная с Android 10 (уровень API 29)
- Исключить цели, соответствующие определенным именам компонентов
Используйте Android Sharesheet
Для всех типов обмена создайте намерение и установите его действие на Intent.ACTION_SEND
. Чтобы отобразить Android Sharesheet, вызовите Intent.createChooser()
, передав ему ваш объект Intent
. Он возвращает версию вашего намерения, которая всегда отображает Android Sharesheet.
Отправить текстовое содержимое
Наиболее простым и распространенным применением Android Sharesheet является отправка текстового контента из одной активности в другую. Например, большинство браузеров могут делиться URL-адресом текущей отображаемой страницы в виде текста с другим приложением. Это полезно для обмена статьей или веб-сайтом с друзьями по электронной почте или в социальных сетях. Вот пример того, как это сделать:
Котлин
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Ява
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
При желании вы можете добавить дополнительные данные, например получателей электронного письма ( EXTRA_EMAIL
, EXTRA_CC
, EXTRA_BCC
), тему электронного письма ( EXTRA_SUBJECT
) и т. д.
Примечание: Некоторые приложения электронной почты, такие как Gmail, ожидают String[]
для дополнительных данных, таких как EXTRA_EMAIL
и EXTRA_CC
. Используйте putExtra(String, String[])
чтобы добавить их в свое намерение.
Отправить двоичный контент
Поделиться бинарными данными с помощью действия ACTION_SEND
. Установите соответствующий тип MIME и поместите URI к данным в дополнительный EXTRA_STREAM
, как показано в следующем примере. Обычно это используется для обмена изображением, но может использоваться для обмена любым типом бинарного контента.
Котлин
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Ява
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
Принимающему приложению необходимо разрешение на доступ к данным, на которые указывает Uri
. Есть два рекомендуемых способа сделать это:
- Сохраните данные в вашем собственном
ContentProvider
, убедившись, что другие приложения имеют правильное разрешение на доступ к вашему провайдеру. Предпочтительным механизмом предоставления доступа является использование per-URI permissions , которые являются временными и предоставляют доступ только принимающему приложению. Простой способ создатьContentProvider
, подобный этому, — использовать вспомогательный классFileProvider
. - Используйте системный
MediaStore
.MediaStore
в первую очередь предназначен для видео, аудио и типов MIME изображений. Однако, начиная с Android 3.0 (уровень API 11), он также может хранить немедийные типы. Для получения дополнительной информации см.MediaStore.Files
. Файлы можно вставлять вMediaStore
с помощьюscanFile()
, после чегоUri
в стилеcontent://
, подходящий для совместного использования, передается в предоставленный обратный вызовonScanCompleted()
. Обратите внимание, что после добавления в системныйMediaStore
контент становится доступным для любого приложения на устройстве.
Используйте правильный тип MIME
Укажите наиболее точный тип MIME, доступный для отправляемых вами данных. Например, используйте text/plain
при отправке простого текста. Вот несколько распространенных типов MIME при отправке простых данных в Android:
Получатели регистрируются для | Отправители отправляют |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Поддерживаемые расширения файлов | application/pdf |
Дополнительную информацию о типах MIME можно найти в официальном реестре типов носителей MIME IANA .
Android Sharesheet может отображать предварительный просмотр контента в зависимости от предоставленного типа MIME. Некоторые функции предварительного просмотра доступны только для определенных типов.
Поделиться несколькими частями контента
Чтобы поделиться несколькими фрагментами контента, используйте действие ACTION_SEND_MULTIPLE
вместе со списком URI, указывающих на контент. Тип MIME меняется в зависимости от смеси контента, которым вы делитесь. Например, если вы делитесь тремя изображениями JPEG, вы используете тип "image/jpg"
. Для смеси типов изображений используйте "image/*"
для соответствия действию, которое обрабатывает любой тип изображения. Хотя возможно делиться смесью типов, мы настоятельно не рекомендуем этого делать, поскольку получателю неясно, что именно должно быть отправлено. Если необходимо отправить несколько типов, используйте "*/*"
. Анализ и обработка ваших данных возлагается на принимающее приложение. Вот пример:
Котлин
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Ява
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, null));
Убедитесь, что предоставленные объекты Uri
указывают на данные, к которым может получить доступ принимающее приложение.
Добавьте расширенный контент в текстовые превью
Начиная с Android 10 (уровень API 29), Android Sharesheet показывает предварительный просмотр текста, которым делятся. В некоторых случаях текст, которым делятся, может быть сложным для понимания. Рассмотрите возможность поделиться сложным URL-адресом, например https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Более подробный предварительный просмотр может убедить ваших пользователей в том, что именно делятся.
Если вы просматриваете текст, вы можете задать заголовок, миниатюру изображения или и то, и другое. Добавьте описание к Intent.EXTRA_TITLE
перед вызовом Intent.createChooser()
и добавьте соответствующую миниатюру с помощью ClipData
.
Примечание: URI содержимого изображения предоставляется FileProvider
, обычно из настроенного <cache-path>
. Для получения дополнительной информации см. Общий доступ к файлам . Обязательно предоставьте Sharesheet правильные разрешения на чтение любого изображения, которое вы хотите использовать в качестве миниатюры. Для получения дополнительной информации см. Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Вот пример:
Котлин
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Ява
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
Предварительный просмотр выглядит примерно так:

Добавить пользовательские действия в таблицу обмена

Скриншот пользовательских действий на Android Sharesheet.
На Android 14 (API Level 34) и выше приложения могут добавлять пользовательские действия в Android Sharesheet. Пользовательские действия отображаются в виде небольших значков действий в верхней части Android Sharesheet, и приложения могут указывать любое Intent
в качестве действия, вызываемого при нажатии на значок.
Чтобы добавить пользовательские действия в Android Sharesheet, сначала создайте ChooserAction
с ChooserAction.Builder
. Вы можете указать PendingIntent
как действие, вызываемое при щелчке по значку. Создайте массив, содержащий все ваши пользовательские действия, и укажите его как EXTRA_CHOOSER_CUSTOM_ACTIONS
для общего Intent
.
Котлин
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Ява
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Добавить пользовательские цели
Android Sharesheet позволяет указать до двух объектов ChooserTarget
, которые отображаются перед ярлыками общего доступа и целями выбора, загруженными из ChooserTargetServices
. Вы также можете указать до двух намерений, указывающих на действия, которые перечислены перед предложениями приложений:

Добавьте Intent.EXTRA_CHOOSER_TARGETS
и Intent.EXTRA_INITIAL_INTENTS
к вашему общему намерению после вызова Intent.createChooser()
:
Котлин
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Ява
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Используйте эту функцию с осторожностью. Каждое добавление пользовательского Intent
и ChooserTarget
уменьшает число, предлагаемое системой. Обычно мы не рекомендуем добавлять пользовательские цели. Обычный подходящий пример добавления Intent.EXTRA_INITIAL_INTENTS
— предоставление дополнительных действий, которые пользователи могут выполнять с общим контентом. Например, пользователь делится изображениями, а Intent.EXTRA_INITIAL_INTENTS
используется, чтобы позволить им вместо этого отправлять ссылку. Обычный подходящий пример добавления Intent.EXTRA_CHOOSER_TARGETS
— отображение соответствующих людей или устройств, которые предоставляет ваше приложение.
Исключить конкретные цели по компоненту
Вы можете исключить определенные цели, указав Intent.EXTRA_EXCLUDE_COMPONENTS
. Делайте это только для удаления целей, которые вы контролируете. Обычный вариант использования — скрыть цели общего доступа вашего приложения, когда ваши пользователи делятся из вашего приложения, поскольку их намерение, скорее всего, будет делиться за пределами вашего приложения.
Добавьте Intent.EXTRA_EXCLUDE_COMPONENTS
к вашему намерению после вызова Intent.createChooser()
:
Котлин
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Ява
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Получить информацию о совместном использовании
Может быть полезно знать, когда ваши пользователи делятся и какую цель они выбирают. Android Sharesheet позволяет вам получить эту информацию, предоставляя ComponentName
целей, которые ваши пользователи выбирают с помощью IntentSender
.
Сначала создайте PendingIntent
для BroadcastReceiver
и укажите его IntentSender
в Intent.createChooser()
:
Котлин
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Ява
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
Получите обратный вызов в MyBroadcastReceiver
и посмотрите в Intent.EXTRA_CHOSEN_COMPONENT
:
Котлин
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Ява
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Добавить пользовательские действия в таблицу обмена
На Android 14 (API Level 34) и выше приложения могут добавлять пользовательские действия в Android Sharesheet. Создайте ChooserAction
с помощью ChooserAction.Builder
. Вы можете указать PendingIntent
как действие, вызываемое при нажатии на значок. Создайте массив, содержащий все ваши пользовательские действия, и укажите его как EXTRA_CHOOSER_CUSTOM_ACTIONS
для Share Intent
.
Котлин
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Ява
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Используйте Android Intent resolver

Скриншот решателя намерений ACTION_SEND
.
Android Intent resolver лучше всего использовать при отправке данных в другое приложение в рамках четко определенного потока задач.
Чтобы использовать Android Intent resolver, создайте Intent и добавьте дополнения, как если бы вы вызывали Android Sharesheet. Однако не вызывайте Intent.createChooser()
.
Если установлено несколько приложений с фильтрами, соответствующими ACTION_SEND
и типу MIME, система отображает диалоговое окно устранения неоднозначности, называемое разрешателем намерений , которое позволяет пользователю выбрать цель для обмена. Если соответствует одно приложение, оно запускается.
Вот пример того, как использовать определитель намерений Android для отправки текста:
Котлин
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Ява
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);
Узнать больше
Дополнительную информацию об отправке данных см. в разделах Намерения и Фильтры намерений.