Приложение может не только отправлять данные в другие приложения, но и получать их от них. Подумайте, как пользователи взаимодействуют с вашим приложением и какие типы данных вы хотите получать от других приложений. Например, приложению социальной сети может быть интересно получить текстовый контент, например URL интересного сайта, из другого приложения.
В приложении, использующем Compose Navigation, получение данных, отправленных другим приложением, состоит из двух этапов:
Объявите
<intent-filter>в манифесте. Вам все равно нужно добавить фильтр intent в объект Activity в файле AndroidManifest.xml. Это позволяет ОС Android понять, что ваше приложение может получать определенные действия (например, ACTION_SEND) и MIME-типы (например, text/plain).Определите navDeepLink в графе навигации Compose. Вместо того чтобы вручную перехватывать и анализировать Intent в методах onCreate или onNewIntent Activity, используйте поддержку глубоких ссылок в Compose Navigation. Прикрепите navDeepLink, соответствующий действию и MIME-типу, непосредственно к composable-функции назначения, в которой должен показываться контент. NavController автоматически перехватит Intent и перенаправит пользователя на нужный экран.
Цели функции "Прямой обмен" – это ссылки на контент, ведущие к определенному Activity в приложении. Они часто представляют собой пользователя или группу и показываются на панели "Поделиться". Например, приложение для обмена сообщениями может предоставить целевой объект Direct Share для пользователя, который напрямую связывает с чатом с этим пользователем. Подробные инструкции приведены в статье Как указать целевые объекты для функции "Прямой доступ".
Поддерживаемые MIME-типы
В идеале приложение должно поддерживать как можно больше MIME-типов.
Например, мессенджер, предназначенный для отправки текста, изображений и видео, должен поддерживать получение text/*, image/* и video/*. Ниже приведены некоторые распространенные MIME-типы для отправки и получения простых данных в Android.
| Регистрация получателей | Отправители отправляют |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Поддерживаемые расширения файлов | application/pdf |
Ознакомьтесь с официальным реестром MIME-типов медиаконтента на сайте IANA.
Как создавать хорошие цели для Direct Share
Когда пользователь нажимает на цель, связанную с определенным действием, он должен иметь возможность подтвердить и изменить контент, прежде чем использовать его. Это особенно важно для текстовых данных.
Как получать данные с помощью действия
Чтобы получать данные с помощью действия, нужно обновить манифест, обработать входящий контент и убедиться, что пользователь узнает ваше приложение.
Как обновить манифест
Фильтры интентов сообщают системе, какие интенты принимает компонент приложения.
Как и в случае с интентом с действием 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(). Ваше приложение будет указано в качестве варианта на панели "Поделиться" или в окне выбора приложения. Если пользователь выберет ваше приложение, запустится соответствующий объект activity (.ui.MyActivity в приведенном выше примере). Вам нужно будет самостоятельно обработать контент в коде и интерфейсе.
Как обрабатывать входящий контент
Чтобы обработать контент, полученный от Intent, вызовите метод getIntent(), чтобы получить объект Intent. После того как вы получите объект, вы можете изучить его содержимое, чтобы определить, что делать дальше. Если этот объект activity можно запустить из других частей системы (например, из панели запуска), учитывайте это при анализе намерения.
Будьте внимательны при проверке входящих данных, поскольку вы никогда не знаете, что может отправить вам другое приложение. Например, может быть задан неправильный MIME-тип или отправляемое изображение может быть слишком большим. Кроме того, не забывайте обрабатывать двоичные данные в отдельном потоке, а не в основном потоке (потоке интерфейса).
@Composable fun SharesheetHandler() { val activity = LocalActivity.current val intent = activity?.intent when (intent?.action) { Intent.ACTION_SEND -> { if (intent.type == "text/plain") { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } Intent.ACTION_SEND_MULTIPLE -> { if (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 state with the shared text } } private fun handleSendImage(intent: Intent) { val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) imageUri?.let { // Update UI state with the shared image } } private fun handleSendMultipleImages(intent: Intent) { val imageUris = IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) imageUris?.let { // Update UI state with the shared images } }
Обновление интерфейса после получения данных может быть простым, например заполнение элемента TextField, или более сложным, например применение интересного фильтра к фотографии. Дальнейшие действия зависят от вашего приложения.
Отправка URL скриншотов
При создании скриншота вы можете поделиться им и связанным с ним URL.
Это повышает удобство для пользователей. При получении URL убедитесь, что поле EXTRA_TEXT извлечено из намерения, как показано в следующем примере:
IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Handle the EXTRA_TEXT as well val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT) // Update UI state with the shared image and the EXTRA_TEXT if available }
Как сделать так, чтобы пользователи узнавали ваше приложение
В меню "Поделиться" и окне выбора приложения для обработки намерения ваше приложение представлено значком и ярлыком. Оба этих параметра определены в манифесте. Вы можете задать ярлыки для фильтров действий или фильтров интентов, чтобы добавить контекст.
В Android 10 (уровень API 29) и более поздних версиях панель "Поделиться" использует только значки, заданные в манифесте в теге application. Android игнорирует значки, заданные в тегах intent-filter и activity.