Assim como um app pode enviar dados para outros, ele também pode receber dados de outros apps. Pense em como os usuários interagem com seu aplicativo e quais tipos de dados você quer receber de outros aplicativos. Por exemplo, um aplicativo de rede social pode ter interesse em receber conteúdo de texto, como um URL da Web interessante, de outro app.
Em um app que usa o Compose Navigation, o recebimento de dados enviados por outro app é um processo de duas etapas:
Declare um
<intent-filter>no manifesto: ainda é necessário adicionar um filtro de intent à sua atividade no arquivo AndroidManifest.xml. Isso informa ao SO Android que seu aplicativo é capaz de receber ações específicas (como ACTION_SEND) e tipos MIME (como text/plain).Defina um navDeepLink no gráfico de navegação do Compose: em vez de interceptar e analisar manualmente a intent nos métodos onCreate ou onNewIntent da atividade, use o suporte a links diretos da navegação do Compose. Anexe um navDeepLink que corresponda à ação e ao tipo MIME diretamente ao destino combinável que vai mostrar o conteúdo. O NavController vai interceptar automaticamente a intent e direcionar o usuário direto para essa tela.
Os destinos do Compartilhamento Direto são links diretos para uma Activity específica no seu app. Eles geralmente representam uma pessoa ou um grupo, e o Android Sharesheet os mostra. Por exemplo, um app de mensagens pode fornecer um destino do Compartilhamento Direto para uma pessoa que faz um link direto para uma conversa com ela. Consulte Fornecer destinos de compartilhamento direto para instruções detalhadas.
Tipos MIME compatíveis
O ideal é que um app possa receber a maior variedade possível de tipos MIME.
Por exemplo, um app de mensagens projetado para enviar texto, imagens e vídeo
idealmente oferece suporte ao recebimento de text/*, image/* e video/*. Confira alguns tipos MIME comuns para enviar e receber dados simples no Android.
| Os receptores se registram para | Os remetentes enviam |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Extensões de arquivo compatíveis | application/pdf |
Consulte o registro oficial de tipos de mídia MIME da IANA (em inglês).
Criar ótimas metas de compartilhamento
Quando um usuário toca em um destino de compartilhamento associado a uma atividade específica, ele precisa confirmar e editar o conteúdo compartilhado antes de usar. Isso é especialmente importante no caso de dados de mensagens de texto.
Receber dados com uma atividade
Para receber dados com uma atividade, atualize o manifesto, processe o conteúdo recebido e garanta 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.
Assim como 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. Você
define um filtro de intent no manifesto usando o elemento <intent-filter>.
Por exemplo, se o app processa o recebimento de conteúdo de texto, um manifesto que
inclui uma ou mais imagens de qualquer tipo seria semelhante ao seguinte snippet:
<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 uma dessas coisas construindo uma intent e transmitindo-a para startActivity(), seu aplicativo é listado como uma opção no Android Sharesheet ou no resolvedor de intents do Android. Se o usuário
selecionar seu app, isso vai iniciar a atividade correspondente (.ui.MyActivity no
exemplo anterior). Depois, cabe a você processar o conteúdo de maneira adequada
no código e na interface.
Processar o conteúdo recebido
Para processar o conteúdo entregue por um Intent, chame
getIntent() para receber o objeto Intent. Depois de ter o objeto, examine o conteúdo dele para determinar o que fazer em seguida. Se essa atividade puder
ser iniciada em outras partes do sistema (como a tela de início), considere isso
ao examinar a intent.
Tome cuidado extra ao verificar os dados recebidos. 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, processe dados binários em uma linha de execução separada, e não na principal ("UI").
@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 } }
Atualizar a interface depois de receber os dados pode ser tão simples quanto preencher um
TextField,
ou pode ser mais
complicado, como aplicar um filtro de foto interessante a uma imagem. Depende do
seu app o que vai acontecer em seguida.
Compartilhamento de URL de captura de tela
Ao fazer uma captura de tela, você pode compartilhar a imagem e qualquer URL associado.
Isso oferece uma experiência do usuário mais sofisticada. Ao receber um URL, extraia o campo
EXTRA_TEXT da intent, conforme mostrado no exemplo a seguir:
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 }
Garantir que os usuários reconheçam seu app
O app é representado pelo ícone e pelo rótulo na folha de compartilhamento e no resolvedor de intents do Android. Ambos são definidos no manifesto. Você pode definir rótulos de atividade ou filtro de intent para fornecer mais contexto.
No Android 10 (nível 29 da API), a folha de compartilhamento do Android usa apenas ícones definidos no
manifesto na tag application. O Android ignora os ícones definidos nas tags
intent-filter e activity.