Da mesma forma que um app envia dados a outros apps, ele também pode receber dados. Pense em como os usuários interagem com seu aplicativo e nos tipos de dados que você quer receber de outros aplicativos. Por exemplo, para um aplicativo de rede social, pode ser interessante receber conteúdo de texto de outro app, como um URL da Web.
Os usuários de outros apps costumam enviar dados ao seu app pelo Android Sharesheet ou pelo resolvedor de intents. Os apps que enviam dados para o seu precisam definir um tipo MIME para eles. Seu app pode receber dados enviados por outro app das seguintes maneiras:
- Uma
Activity
com uma tagintent-filter
correspondente no manifesto - Atalhos de compartilhamento publicados pelo seu app.
Os destinos do Compartilhamento direto são links diretos para uma atividade específica no seu app. Em geral, eles representam uma pessoa ou um grupo e são exibidos pelo Android Sharesheet. Por exemplo, um app de mensagens de texto pode oferecer um alvo de compartilhamento direto para alguém que tem link direto para uma conversa com essa pessoa. Consulte Fornecer destinos de compartilhamento direto para instruções detalhadas.
Compatibilidade com tipos MIME
O ideal é que um app consiga receber o maior número possível de tipos MIME.
Por exemplo, um app de mensagens projetado para enviar texto, imagens e vídeos
idealmente é compatível com o recebimento de text/*
, image/*
e video/*
. Confira alguns tipos MIME comuns para enviar e receber dados simples no Android.
Os destinatários se inscrevem para | Remetentes enviam |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Extensões de arquivo compatíveis | application/pdf |
Consulte o registro oficial da IANA de tipos MIME de mídia.
Criar excelentes alvos de compartilhamento
Quando um usuário toca em um alvo de compartilhamento associado a uma atividade específica, ele deve poder confirmar e editar o conteúdo compartilhado antes de usá-lo. Isso é especialmente importante no caso de dados de mensagens de texto.
Receber dados com uma atividade
Para receber dados com uma atividade, é necessário atualizar o manifesto, processar o conteúdo recebido e garantir que o usuário reconheça seu app.
Atualizar seu manifesto
Os filtros de intent informam ao sistema quais intents um componente de app aceita.
Da mesma forma que você criou uma intent com uma ação ACTION_SEND
na lição
Como enviar dados simples para outros apps, crie filtros de intent para receber intents com essa ação. O filtro de intent é definido no manifesto usando o elemento <intent-filter>
.
Por exemplo, se o app processa conteúdo de mensagens de texto recebidas, um manifesto que
inclui uma ou mais imagens de qualquer tipo seria semelhante ao snippet a seguir:
<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>
Quando outro app tenta compartilhar qualquer um desses itens criando uma
intent e transmitindo-a para startActivity()
, seu aplicativo
é listado como uma opção no Android Sharesheet ou no resolvedor de intents. Se o usuário selecionar seu app, a atividade correspondente (.ui.MyActivity
no exemplo anterior) será iniciada. Cabe a você processar o conteúdo corretamente no seu código e na interface.
Processar o conteúdo recebido
Para processar o conteúdo enviado por um Intent
, chame
getIntent()
para conseguir o objeto Intent
. Assim que você tiver o objeto, poderá analisar o conteúdo dele e determinar o que fazer em seguida. Se for possível iniciar essa atividade de outras partes do sistema, como a tela de início, considere isso ao analisar a intent.
Verifique os dados recebidos com muita atenção, porque nunca se sabe o que outro aplicativo pode enviar. Por exemplo, o tipo MIME incorreto pode estar definido ou a imagem enviada pode ser grande demais. Além disso, lembre-se de processar dados binários em uma linha de execução separada, não na linha de execução principal (IU).
Kotlin
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 } }
A atualização da interface depois de receber os dados pode ser tão simples quanto preencher um
EditText
ou mais
complicada, como aplicar um filtro de foto interessante a uma imagem. Cabe ao seu app determinar o que acontece em seguida.
Garantir que os usuários reconheçam seu app
Seu app é representado pelo ícone e rótulo no Android Sharesheet e no resolvedor de intents. Ambos são definidos no manifesto. Você pode definir etiquetas de atividade ou de filtro de intent para fornecer mais contexto.
A partir do Android 10 (API de nível 29), o Android Sharesheet usa apenas os ícones definidos no manifesto da sua tag application
. O Android ignora os ícones definidos nas tags
intent-filter
e activity
.