Подобно тому, как приложение может отправлять данные другим приложениям, оно также может получать данные от других приложений. Подумайте о том, как пользователи взаимодействуют с вашим приложением и какие типы данных вы хотите получать от других приложений. Например, приложение для социальных сетей может быть заинтересовано в получении текстового контента, такого как интересный веб-адрес, от другого приложения.
Пользователи других приложений часто отправляют данные в ваше приложение через Android Sharesheet или Intent Resolver. Приложения, отправляющие данные в ваше приложение, должны установить MIME-тип для этих данных. Ваше приложение может получать данные, отправленные другим приложением, следующими способами:
-
Activityс соответствующим тегомintent-filterв манифесте. - Совместное использование ярлыков, опубликованных вашим приложением.
Цели для прямого доступа к контенту — это прямые ссылки на определённое действие в вашем приложении. Часто они представляют собой человека или группу, и всплывающее окно «Поделиться» в Android отображает их. Например, приложение для обмена сообщениями может предоставить цель для прямого доступа к контенту, которая напрямую перенаправляет пользователя в беседу с этим человеком. Подробные инструкции см. в разделе «Предоставление целей для прямого доступа к контенту» .
Поддерживаются типы 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>
Когда другое приложение пытается поделиться чем-либо из перечисленного, создавая Intent и передавая его в startActivity() , ваше приложение отображается в списке доступных вариантов в таблице Sharesheet или Intent Resolver Android. Если пользователь выбирает ваше приложение, запускается соответствующая активность ( .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
}
}
Java
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 , так и более сложным, например, применением интересного фотофильтра к изображению. Дальнейшие действия зависят от вашего приложения.
Ссылка на скриншот для обмена
При создании снимка экрана вы можете поделиться им и связанной с ним ссылкой. Это обеспечивает более удобное взаимодействие с пользователем. При получении ссылки обязательно получите поле EXTRA_TEXT из интента, как показано в следующем примере:
override fun onCreate(savedInstanceState: Bundle?) {
...
when {
intent?.action == Intent.ACTION_SEND -> {
if (intent.type?.startsWith("image/") == true) {
handleSendImage(intent)
}
}
...
}
private fun handleSendImage(intent: Intent) {
(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
// Handle the EXTRA_TEXT as well
intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
// Update UI to reflect image being shared and the EXTRA_TEXT
// if available
}
}
...
}
Убедитесь, что пользователи узнают ваше приложение.
Ваше приложение представлено иконкой и меткой в таблице общего доступа Android и в обработчике намерений. Оба параметра определены в манифесте. Вы можете задать метки для фильтров действий или намерений, чтобы предоставить больше контекста.
Начиная с Android 10 (уровень API 29), в Android Sharesheet используются только значки, заданные в манифесте тега application . Android игнорирует значки, заданные в тегах intent-filter и activity .