Receber dados simples de outros apps

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.

Em um app que usa a navegação do Compose, o recebimento de dados enviados por outro app é um processo de duas etapas:

  1. 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 pode receber ações específicas (como ACTION_SEND) e tipos MIME (como text/plain).

  2. 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 sua 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 precisa mostrar o conteúdo. O NavController vai interceptar automaticamente a intent e direcionar o usuário diretamente para essa tela.

Os destinos de 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 mostrados pelo Android Sharesheet. Por exemplo, um app de mensagens de texto pode oferecer um destino 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.

Oferecer suporte a tipos MIME

O ideal é que um app possa receber o maior número possível de tipos MIME. Por exemplo, um app de mensagens de texto projetado para enviar texto, imagens e vídeos precisa oferecer 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensões de arquivo compatíveis application/pdf

Consulte o registro oficial de tipos de mídia MIME da IANA (link em inglês).

Criar excelentes destinos de compartilhamento

Quando um usuário toca em um destino 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. Você define um filtro de intent no manifesto usando o elemento <intent-filter>. Por exemplo, se seu 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, isso vai iniciar a atividade correspondente (.ui.MyActivity no exemplo anterior). Cabe a você processar o conteúdo corretamente no seu código e na IU.

Processar o conteúdo recebido

Para processar o conteúdo entregue por uma Intent, chame getIntent() para receber o objeto Intent. Depois de ter o objeto, você pode examinar o conteúdo dele para 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 examinar 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).

@Composable
fun SharesheetHandler() {
    val context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        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_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
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

A atualização da IU depois de receber os dados pode ser tão simples quanto preencher um TextField ou mais complexa, como aplicar um filtro de foto interessante a uma imagem. Cabe ao seu app determinar o que acontece em seguida.

Compartilhamento de URL de captura de tela

Ao fazer uma captura de tela, você pode compartilhar a captura e qualquer URL associado. Isso oferece uma experiência do usuário mais rica. 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 ViewModel state to change state image being shared and the EXTRA_TEXT
    // if available
}

Garantir que os usuários reconheçam seu app

Seu app é representado pelos próprios icon e label 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 (nível 29 da API), 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.