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

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

Android предоставляет пользователям два способа обмена данными между приложениями:

  • Приложение Android Sharesheet в первую очередь предназначено для отправки контента за пределы вашего приложения и/или напрямую другому пользователю. Например, чтобы поделиться URL-адресом с другом.
  • Android Intent Resolution лучше всего подходит для передачи данных на следующий этап четко определенной задачи. Например, для открытия PDF-файла из вашего приложения и предоставления пользователям возможности выбрать предпочитаемое средство просмотра.

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

Зачем использовать Android Sharesheet

Мы настоятельно рекомендуем использовать Sharesheet для Android, чтобы обеспечить единообразие для пользователей всех приложений. Не отображайте собственный список целей для публикации в вашем приложении и не создавайте собственные варианты Sharesheet.

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

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

Используйте 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 , убедившись, что у других приложений есть необходимые разрешения на доступ к вашему поставщику. Предпочтительным механизмом предоставления доступа является использование разрешений на уровне URI , которые являются временными и предоставляют доступ только приложению-получателю. Простой способ создать такой 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Поддерживаемые расширения файлов application/pdf

Дополнительную информацию о типах MIME можно найти в официальном реестре типов медиафайлов MIME IANA .

В зависимости от указанного MIME-типа, в Android Sharesheet может отображаться предварительный просмотр содержимого. Некоторые функции предварительного просмотра доступны только для определённых типов.

Поделиться несколькими фрагментами контента

Чтобы поделиться несколькими фрагментами контента, используйте действие 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 уровня 34) и более поздних версиях приложения могут добавлять настраиваемые действия в Android Sharesheet. Настраиваемые действия отображаются в виде небольших значков действий в верхней части Android Sharesheet, и приложения могут указывать любое Intent в качестве действия, вызываемого при нажатии на значок.

Чтобы добавить настраиваемые действия в 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 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 уровня 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 Resolution

Скриншот решателя намерений ACTION_SEND .

Android Intent Resolution лучше всего использовать при отправке данных в другое приложение в рамках четко определенного потока задач.

Чтобы использовать преобразователь намерений Android, создайте намерение и добавьте дополнительные параметры, как при вызове Android Sharesheet. Однако не вызывайте Intent.createChooser() .

Если установлено несколько приложений с фильтрами, соответствующими ACTION_SEND и MIME-типу, система отображает диалоговое окно разрешения неоднозначности, называемое « распознавателем намерений» , которое позволяет пользователю выбрать цель для публикации. Если хотя бы одно приложение соответствует критериям, оно запускается.

Вот пример того, как использовать Android Intent Resolver для отправки текста:

Котлин

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);

Узнать больше

Дополнительную информацию об отправке данных см. в разделах Намерения и Фильтры намерений.

,

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

Android предоставляет пользователям два способа обмена данными между приложениями:

  • Приложение Android Sharesheet в первую очередь предназначено для отправки контента за пределы вашего приложения и/или напрямую другому пользователю. Например, чтобы поделиться URL-адресом с другом.
  • Android Intent Resolution лучше всего подходит для передачи данных на следующий этап четко определенной задачи. Например, для открытия PDF-файла из вашего приложения и предоставления пользователям возможности выбрать предпочитаемое средство просмотра.

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

Зачем использовать Android Sharesheet

Мы настоятельно рекомендуем использовать Sharesheet для Android, чтобы обеспечить единообразие для пользователей всех приложений. Не отображайте собственный список целей для публикации в вашем приложении и не создавайте собственные варианты Sharesheet.

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

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

Используйте 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 , убедившись, что у других приложений есть необходимые разрешения на доступ к вашему поставщику. Предпочтительным механизмом предоставления доступа является использование разрешений на уровне URI , которые являются временными и предоставляют доступ только приложению-получателю. Простой способ создать такой 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Поддерживаемые расширения файлов application/pdf

Дополнительную информацию о типах MIME можно найти в официальном реестре типов медиафайлов MIME IANA .

В зависимости от указанного MIME-типа, в Android Sharesheet может отображаться предварительный просмотр содержимого. Некоторые функции предварительного просмотра доступны только для определённых типов.

Поделиться несколькими фрагментами контента

Чтобы поделиться несколькими фрагментами контента, используйте действие 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 уровня 34) и более поздних версиях приложения могут добавлять настраиваемые действия в Android Sharesheet. Настраиваемые действия отображаются в виде небольших значков действий в верхней части Android Sharesheet, и приложения могут указывать любое Intent в качестве действия, вызываемого при нажатии на значок.

Чтобы добавить настраиваемые действия в 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 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 уровня 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 Resolution

Скриншот решателя намерений ACTION_SEND .

Android Intent Resolution лучше всего использовать при отправке данных в другое приложение в рамках четко определенного потока задач.

Чтобы использовать преобразователь намерений Android, создайте намерение и добавьте дополнительные параметры, как при вызове Android Sharesheet. Однако не вызывайте Intent.createChooser() .

Если установлено несколько приложений с фильтрами, соответствующими ACTION_SEND и MIME-типу, система отображает диалоговое окно разрешения неоднозначности, называемое « распознавателем намерений» , которое позволяет пользователю выбрать цель для публикации. Если хотя бы одно приложение соответствует критериям, оно запускается.

Вот пример того, как использовать Android Intent Resolver для отправки текста:

Котлин

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);

Узнать больше

Дополнительную информацию об отправке данных см. в разделах Намерения и Фильтры намерений.