Приложение может не только отправлять данные другим приложениям, но и получать их. Подумайте о том, как пользователи взаимодействуют с вашим приложением и какие типы данных вы хотите получать от других приложений. Например, приложение социальной сети может быть заинтересовано в получении текстового контента, например, интересного URL-адреса, от другого приложения.
Пользователи других приложений часто отправляют данные в ваше приложение через Android Sharesheet или Intent Resolution. Приложения, отправляющие данные в ваше приложение, должны установить MIME-тип для этих данных. Ваше приложение может получать данные, отправленные другим приложением, следующими способами:
-
Activity
с соответствующим тегомintent-filter
в манифесте - Ярлыки общего доступа, опубликованные вашим приложением.
Цели Direct Share — это глубокие ссылки на определённое действие в вашем приложении. Они часто представляют человека или группу, и в Android Sharesheet они отображаются. Например, приложение для обмена сообщениями может предоставить цель Direct Share для человека, которая напрямую перенаправит вас в беседу с этим человеком. Подробные инструкции см. в разделе «Указание целей Direct Share» .
Поддержка типов MIME
В идеале приложение должно поддерживать максимально широкий диапазон типов MIME. Например, приложение для обмена сообщениями, предназначенное для отправки текста, изображений и видео, в идеале поддерживает приём text/*
, image/*
и video/*
. Вот несколько распространённых типов MIME для отправки и получения простых данных в Android.
Получатели регистрируются для | Отправители отправляют |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Поддерживаемые расширения файлов | application/pdf |
Обратитесь к официальному реестру типов медиафайлов MIME IANA .
Создавайте большие цели для обмена
Когда пользователь нажимает на ссылку, связанную с определенным действием, он должен иметь возможность подтвердить и отредактировать опубликованный контент перед его использованием. Это особенно важно для текстовых данных.
Получать данные с активностью
Получение данных с помощью активности включает обновление вашего манифеста, обработку входящего контента и обеспечение того, чтобы пользователь распознавал ваше приложение.
Обновите свой манифест
Фильтры намерений сообщают системе, какие намерения принимает компонент приложения. Аналогично тому, как вы создавали намерение с действием ACTION_SEND
в уроке « Отправка простых данных в другие приложения» , вы создаете фильтры намерений для получения намерений с помощью этого действия. Фильтр намерений определяется в манифесте с помощью элемента <intent-filter>
. Например, если ваше приложение обрабатывает получение текстового контента, манифест, включающий одно или несколько изображений любого типа, будет выглядеть следующим образом:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Когда другое приложение пытается поделиться любым из этих элементов, формируя намерение и передавая его в startActivity()
, ваше приложение отображается в качестве варианта в Android Sharesheet или в Intent Resolution. Если пользователь выбирает ваше приложение, запускается соответствующее действие ( .ui.MyActivity
в предыдущем примере). После этого вам необходимо будет соответствующим образом обработать содержимое в вашем коде и пользовательском интерфейсе.
Обработка входящего контента
Чтобы обработать содержимое, переданное объектом Intent
, вызовите getIntent()
, чтобы получить объект Intent
. Получив объект, вы можете изучить его содержимое, чтобы определить дальнейшие действия. Если это действие можно запустить из других частей системы (например, из панели запуска), учтите это при анализе объекта Intent.
Будьте особенно внимательны и проверяйте входящие данные: никогда не знаешь, что может отправить вам другое приложение. Например, может быть установлен неправильный тип MIME или отправляемое изображение может быть слишком большим. Также не забывайте обрабатывать двоичные данные в отдельном потоке, а не в основном потоке (потоке пользовательского интерфейса).
Котлин
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Ява
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
Обновление пользовательского интерфейса после получения данных может быть простым, например, заполнением EditText
, или более сложным, например, применением интересного фотофильтра к изображению. Дальнейшие действия зависят от вашего приложения.
Убедитесь, что пользователи узнают ваше приложение
Ваше приложение представлено значком и меткой в Android Sharesheet и Intent resolver. Оба эти элемента определены в манифесте. Вы можете настроить метки фильтров действий или намерений для предоставления более подробного контекста.
Начиная с Android 10 (уровень API 29), Android Sharesheet использует только значки, заданные в манифесте тега вашего application
. Android игнорирует значки, заданные в тегах intent-filter
и activity
.