Точно так же, как приложение может отправлять данные другим приложениям, оно также может получать данные от других приложений. Подумайте, как пользователи взаимодействуют с вашим приложением и какие типы данных вы хотите получать от других приложений. Например, приложение социальной сети может быть заинтересовано в получении текстового контента, например интересного веб-URL-адреса, из другого приложения.
Пользователи других приложений часто отправляют данные в ваше приложение через Android Sharesheet или преобразователь намерений. Приложения, которые отправляют данные в ваше приложение, должны установить для этих данных тип MIME. Ваше приложение может получать данные, отправленные другим приложением, следующими способами:
-
Activity
с соответствующим тегомintent-filter
в манифесте. - Совместное использование ярлыков, опубликованных вашим приложением.
Цели Direct Share — это глубокие ссылки на определенное действие в вашем приложении. Они часто представляют человека или группу, и их отображает таблица Android Sharesheet. Например, приложение для обмена сообщениями может предоставить человеку цель Direct Share, которая напрямую ссылается на разговор с этим человеком. Подробные инструкции см. в разделе Предоставление целевых объектов Direct Share .
Поддержка типов MIME
В идеале приложение должно иметь возможность получать максимально широкий диапазон типов MIME. Например, приложение для обмена сообщениями, предназначенное для отправки текста, изображений и видео, идеально поддерживает получение text/*
, image/*
и video/*
. Вот несколько распространенных типов MIME для отправки и получения простых данных в Android.
Получатели регистрируются на | Отправители отправляют |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Поддерживаемые расширения файлов | application/pdf |
Обратитесь к официальному реестру типов мультимедиа 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 или преобразователе намерений. Если пользователь выбирает ваше приложение, это запускает соответствующее действие ( .ui.MyActivity
в предыдущем примере). Затем вам решать, как правильно обрабатывать контент в вашем коде и пользовательском интерфейсе.
Обрабатывать входящий контент
Чтобы обработать контент, доставленный Intent
, вызовите getIntent()
чтобы получить объект Intent
. Получив объект, вы можете изучить его содержимое, чтобы определить, что делать дальше. Если это действие можно запустить из других частей системы (например, из средства запуска), примите это во внимание при проверке намерения.
Будьте особенно внимательны к проверке входящих данных, никогда не знаешь, что вам может отправить какое-то другое приложение. Например, может быть установлен неверный тип MIME или отправляемое изображение может быть очень большим. Кроме того, не забудьте обрабатывать двоичные данные в отдельном потоке, а не в основном потоке («UI»).
Котлин
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 и преобразователе намерений. Оба они определены в манифесте. Вы можете установить метки фильтра действий или намерений, чтобы предоставить больше контекста.
Начиная с Android 10 (уровень API 29), Android Sharesheet использует только значки, установленные в манифесте тега вашего application
. Android игнорирует значки, установленные в тегах intent-filter
и activity
.