Receber dados simples de outros apps

Assim como um app pode enviar dados para outros apps, 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 estar interessado em receber conteúdo de texto, como um URL da Web interessante, de outro app.

Os usuários de outros apps costumam enviar dados ao seu app pelo Android Sharesheet ou pelo resolvedor de intents. Apps que enviam dados para seu app precisam definir um tipo MIME para esses dados. Seu app pode receber dados enviados por outro app das seguintes maneiras:

  • Uma Activity com uma tag intent-filter correspondente no manifesto
  • Atalhos de compartilhamento publicados pelo seu app.

Os destinos de compartilhamento direto são links diretos para uma atividade específica no seu app. Geralmente, eles representam uma pessoa ou um grupo e são exibidos pelo Android Sharesheet. Por exemplo, um app de mensagens pode fornecer um destino de compartilhamento direto para uma pessoa com link direto para uma conversa com essa pessoa. Consulte Fornecer destinos de compartilhamento direto para instruções detalhadas.

Suporte a tipos MIME

O ideal é que um app seja capaz de receber o maior intervalo possível de tipos MIME. Por exemplo, um app de mensagens projetado para enviar texto, imagens e vídeos, de preferência, oferece suporte ao recebimento de text/*, image/* e video/*. Confira alguns tipos MIME comuns para enviar e receber dados simples no Android.

Os receptores são registrados para Envio do remetente
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 IANA de tipos MIME de mídia.

Crie ótimos alvos de compartilhamento

Quando um usuário toca em um alvo de compartilhamento associado a uma atividade específica, ele 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

Receber dados com uma atividade envolve a atualização do manifesto, o processamento do conteúdo recebido e a garantia de que o usuário reconheça o app.

Atualizar seu manifesto

Os filtros de intent informam ao sistema quais intents um componente do app aceita. Assim como você construiu 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 processar o recebimento de conteúdo de texto, um manifesto que inclui uma ou mais imagens de qualquer tipo vai ser parecido com este 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 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 será iniciada (.ui.MyActivity no exemplo anterior). 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 uma Intent, chame getIntent() para receber o objeto Intent. Depois de ter o objeto, é possível examinar o conteúdo dele para determinar o que fazer em seguida. Se essa atividade puder ser iniciada de outras partes do sistema (como a tela de início), considere isso ao examinar a intent.

Verifique os dados recebidos com cuidado, 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, em vez de 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 pode ser mais complicada, como aplicar um filtro de foto interessante a uma imagem. Cabe ao seu app definir o que acontece em seguida.

Garantir que os usuários reconheçam seu app

O app é representado pelo ícone e etiqueta dele no Android Sharesheet e no resolvedor de intents. Ambos são definidos no manifesto. Você pode definir rótulos de atividade ou 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.