Enviar dados para outros apps

O Android usa intents e extras associados para permitir que os usuários compartilhem informações de maneira rápida usando os apps favoritos.

O Android oferece duas maneiras para os usuários compartilharem dados entre apps:

  • O Android Sharesheet foi projetado principalmente para enviar conteúdo fora do app e/ou diretamente para outro usuário. Por exemplo, compartilhar um URL com um amigo.
  • O resolvedor de intents do Android é mais adequado para transmitir dados para o próximo estágio de uma tarefa bem definida. Por exemplo, abrir um PDF no seu app e permitir que os usuários escolham o visualizador preferido.

Ao criar uma intent, você especifica a ação a ser executada por ela. O Android usa a ação ACTION_SEND para enviar dados de uma atividade a outra, mesmo entre limites de processos. É necessário especificar os dados e o tipo deles. O sistema identifica automaticamente as atividades compatíveis que podem receber os dados e as exibe para o usuário. No caso do resolvedor de intents, se apenas uma atividade puder lidar com a intent, essa atividade será iniciada imediatamente.

Por que usar o Android Sharesheet

É altamente recomendado usar o Android Sharesheet para criar consistência para seus usuários nos apps. Não mostre a própria lista de destinos de compartilhamento do app nem crie suas próprias variações do Sharesheet.

O Android Sharesheet permite que os usuários compartilhem informações com a pessoa certa, incluindo sugestões de app relevantes, tudo em um único toque. O Sharesheet pode sugerir destinos indisponíveis para soluções personalizadas e usa uma classificação consistente. Isso ocorre porque o Sharesheet pode levar em conta informações sobre o app e a atividade do usuário que estão disponíveis apenas para o sistema.

O Android Sharesheet também conta com muitos recursos úteis para desenvolvedores. Por exemplo, é possível fazer o seguinte:

Usar o Android Sharesheet

Para todos os tipos de compartilhamento, crie uma intent e defina a ação como Intent.ACTION_SEND. Para mostrar o Android Sharesheet, chame Intent.createChooser(), transmitindo a ele seu Intent objeto. Ele retornará uma versão da sua intent que sempre mostrará o Android Sharesheet.

Enviar conteúdo de texto

O uso mais direto e comum do Android Sharesheet é enviar conteúdo de texto de uma atividade para outra. Por exemplo, a maioria dos navegadores pode compartilhar o URL da página mostrada no momento como texto com outro app. Essa opção é muito usada para compartilhar um artigo ou site com amigos por e-mail ou redes sociais. Veja como fazer isso a seguir:

fun shareText(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }

    val shareIntent = Intent.createChooser(sendIntent, null)
    context.startActivity(shareIntent)
}

Opcionalmente, você pode adicionar outros elementos para incluir mais informações, como destinatários de e-mail (EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC), assunto do e-mail (EXTRA_SUBJECT) e assim por diante.

Observação:alguns apps de e-mail, como o Gmail, esperam uma String[] para elementos extras, como EXTRA_EMAIL e EXTRA_CC. Use putExtra(String, String[]) para adicioná-los à sua intent.

Enviar conteúdo binário

Compartilhe dados binários usando a ação ACTION_SEND. Defina o tipo MIME apropriado e coloque um URI para os dados no elemento extra EXTRA_STREAM, conforme mostrado no exemplo a seguir. Em geral, essa opção é usada com frequência para compartilhar imagens, mas pode ser usada para compartilhar qualquer tipo de conteúdo binário.

fun shareBinaryContent(context: Context) {
    val shareIntent: Intent = Intent().apply {
        action = ACTION_SEND
        // Example: content://com.google.android.apps.photos.contentprovider/...
        val imageUri: Uri =
            Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1")
        putExtra(Intent.EXTRA_STREAM, imageUri)
        type = "image/jpeg"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

O aplicativo receptor precisa de permissão para acessar os dados que o Uri indica. Há duas maneiras recomendadas de fazer isso:

  • Armazene os dados no próprio ContentProvider, garantindo que outros apps tenham a permissão correta para acessar seu provedor. O mecanismo preferencial para conceder acesso é usar permissões por URI, que são temporárias e só concedem acesso ao aplicativo receptor. Uma maneira de criar um ContentProvider como esse é usar a classe auxiliar FileProvider.
  • Use o MediaStore do sistema. O MediaStore é destinado principalmente a tipos MIME de vídeo, áudio e imagem. No entanto, a partir do Android 3.0 (nível 11 da API), ele também pode armazenar tipos que não são de mídia. Para mais informações, consulte MediaStore.Files. É possível inserir arquivos no MediaStore usando scanFile(), seguido de um Uri de estilo content:// adequado para compartilhamento, que é transmitido para o callback onScanCompleted() fornecido. Observação: depois de adicionado ao MediaStore do sistema, o conteúdo fica acessível a qualquer app no dispositivo.

Usar o tipo MIME correto

Forneça o tipo MIME mais específico disponível para os dados que você está enviando. Por exemplo, use text/plain ao compartilhar texto simples. Confira alguns tipos MIME comuns para o envio de dados 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

Para mais informações sobre tipos MIME, consulte o IANA registro oficial IANA de tipos MIME de mídia.

O Android Sharesheet pode mostrar uma visualização de conteúdo, dependendo do tipo MIME fornecido. Alguns recursos de visualização estão disponíveis apenas para tipos específicos.

Compartilhar várias partes de conteúdo

Para compartilhar várias partes do conteúdo, use a ação ACTION_SEND_MULTIPLE junto com uma lista de URIs que apontam para o conteúdo. O tipo MIME varia de acordo com a combinação de conteúdos que você está compartilhando. Por exemplo, se você compartilhar três imagens JPEG, use o tipo "image/jpg". Para uma mistura de tipos de imagem, use "image/*" para corresponder a uma atividade que lida com qualquer tipo de imagem. Embora seja possível compartilhar uma mistura de tipos, não recomendamos isso, porque não fica claro para o receptor o que deve ser enviado. Se for necessário enviar vários tipos, use "*/*". Cabe ao aplicativo receptor analisar e processar seus dados. Veja um exemplo:

fun shareMultiple(context: Context) {
    val imageUris: ArrayList<Uri> = arrayListOf(
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/1"),
        Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/2")
    )

    val shareIntent = Intent().apply {
        action = Intent.ACTION_SEND_MULTIPLE
        putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
        type = "image/*"
    }
    context.startActivity(Intent.createChooser(shareIntent, null))
}

Verifique se os objetos Uri fornecidos apontam para dados que podem ser acessados por um app receptor.

Adicionar conteúdo avançado a visualizações de texto

A partir do Android 10 (nível 29 da API), o Android Sharesheet mostra uma visualização do texto que está sendo compartilhado. Em alguns casos, o texto compartilhado pode ser difícil de entender. Imagine um caso de compartilhamento de um URL complicado, como https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. Uma visualização mais avançada pode tranquilizar os usuários com relação ao que está sendo compartilhado.

Se você estiver visualizando o texto, poderá definir um título, uma imagem em miniatura ou ambos. Adicione uma descrição a Intent.EXTRA_TITLE antes de chamar Intent.createChooser() e adicione uma miniatura relevante usando ClipData.

Observação: o URI de conteúdo da imagem é fornecido de um FileProvider, geralmente de um <cache-path> configurado. Para mais informações, consulte Compartilhamento de arquivos. O Sharesheet precisa ter as permissões corretas para ler qualquer imagem que você queira usar como miniatura. Para mais informações, consulte Intent.FLAG_GRANT_READ_URI_PERMISSION.

Veja um exemplo:

fun richContentToTextPreviewShares(context: Context) {
    val share = Intent.createChooser(
        Intent().apply {
            action = ACTION_SEND
            putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/")

            // (Optional) Here you're setting the title of the content
            putExtra(Intent.EXTRA_TITLE, "Introducing content previews")

            // (Optional) Here you're passing a content URI to an image to be displayed
            data =
                Uri.parse("content://com.google.android.apps.photos.contentprovider/0/1/mediakey/A123456789")
            flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
        },
        null
    )
    context.startActivity(share)
}

A visualização fica assim:

Adicionar ações personalizadas ao Sharesheet

Captura de tela de ações personalizadas no Android Sharesheet.

No Android 14 (nível 34 da API) e versões mais recentes, os apps podem adicionar ações personalizadas ao Android Sharesheet. As ações personalizadas são mostradas como pequenos ícones de ação na parte de cima do Android Sharesheet, e os apps podem especificar qualquer Intent como a ação invocada quando o ícone é clicado.

Para adicionar ações personalizadas no Android Sharesheet, primeiro crie um ChooserAction com ChooserAction.Builder. Você pode especificar um PendingIntent como a ação invocada quando o ícone é clicado. Crie uma matriz contendo todas as ações personalizadas e especifique-a como EXTRA_CHOOSER_CUSTOM_ACTIONS da Intent de compartilhamento.

fun sharesheetCustomActions(context: Context, previewText: String) {
    val sendIntent = Intent(ACTION_SEND)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_TEXT, previewText)
    val shareIntent = Intent.createChooser(sendIntent, null)
    val customActions = arrayOf(
        ChooserAction.Builder(
            Icon.createWithResource(context, R.drawable.ic_logo),
            "Custom",
            PendingIntent.getBroadcast(
                context,
                1,
                Intent(Intent.ACTION_VIEW),
                PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
            )
        ).build()
    )
    shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions)
    context.startActivity(shareIntent)
}

Adicionar destinos personalizados

O Android Sharesheet permite especificar até dois ChooserTarget objetos que são mostrados antes dos atalhos de compartilhamento e dos destinos do seletor carregados de ChooserTargetServices. Você também pode especificar até duas intents que apontam para as atividades listadas antes das sugestões de apps:

Adicione Intent.EXTRA_CHOOSER_TARGETS e Intent.EXTRA_INITIAL_INTENTS à intent de compartilhamento depois de chamar Intent.createChooser():

val share = Intent.createChooser(shareIntent, null).apply {
    putExtra(
        Intent.EXTRA_CHOOSER_TARGETS,
        arrayOf(chooserTargetJessica, chooserTargetSpyros)
    )
    putExtra(
        Intent.EXTRA_INITIAL_INTENTS,
        arrayOf(intentTargetNearbyShare, intentTargetMaps)
    )
}

Use esse recurso com cuidado. Cada Intent e ChooserTarget personalizados que você adiciona reduz o número sugerido pelo sistema. Geralmente, não recomendamos adicionar destinos personalizados. Um exemplo comum da adição de Intent.EXTRA_INITIAL_INTENTS é disponibilizar outras ações que os usuários podem realizar em conteúdos compartilhados. Por exemplo, o usuário compartilha imagens, e Intent.EXTRA_INITIAL_INTENTS é usado para oferecer a capacidade de enviar um link. Um exemplo comum da adição de Intent.EXTRA_CHOOSER_TARGETS é mostrar pessoas ou dispositivos relevantes para os quais seu app é oferecido.

Excluir destinos específicos por componente

Você pode excluir destinos específicos fornecendo Intent.EXTRA_EXCLUDE_COMPONENTS. Faça isso apenas para remover os destinos que você controla. Um caso de uso comum é ocultar os destinos de compartilhamento do app quando seus usuários compartilham de dentro dele, uma vez que a intent tende a compartilhar fora dele.

Adicione Intent.EXTRA_EXCLUDE_COMPONENTS à intent depois de chamar Intent.createChooser():

fun excludeSpecificTargets(context: Context) {
    val share = Intent.createChooser(Intent(ACTION_SEND), null).apply {
        // Only use for components you have control over
        val excludedComponentNames =
            arrayOf(ComponentName("com.example.android", "ExampleClass"))
        putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames)
    }
    context.startActivity(share)
}

Receber informações sobre compartilhamento

Pode ser útil saber quando seus usuários estão compartilhando e qual é o destino selecionado. O Android Sharesheet permite que você receba essas informações fornecendo o ComponentName de destinos que os usuários selecionam usando um IntentSender.

Primeiro, crie um PendingIntent para um BroadcastReceiver e forneça o IntentSender dele em Intent.createChooser():

fun infoAboutSharing(context: Context, requestCode: Int) {
    var share = Intent(ACTION_SEND)
    // ...
    val pi = PendingIntent.getBroadcast(
        context, requestCode,
        Intent(context, ShareBroadcastReceiver::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    share = Intent.createChooser(share, null, pi.intentSender)
    context.startActivity(share)
}

Receba o callback em MyBroadcastReceiver e procure em Intent.EXTRA_CHOOSER_RESULT:

override fun onReceive(context: Context?, intent: Intent) {
    val TAG = ShareBroadcastReceiver::class.simpleName
    val chooserResult: ChooserResult? = IntentCompat.getParcelableExtra(
        intent,
        Intent.EXTRA_CHOOSER_RESULT,
        ChooserResult::class.java,
    )
    chooserResult?.let {
        Log.i(TAG,
            "Share callback: isShortcut: ${it.isShortcut}, type: ${typeToString(it.type)}, componentName: ${it.selectedComponent}",
        )
    } ?: Log.i(TAG, "chooserResult is null")
}
Consulte o exemplo de compartilhamento da plataforma para mais informações:

Adicionar ações personalizadas ao Sharesheet

No Android 14 (nível 34 da API) e versões mais recentes, os apps podem adicionar ações personalizadas ao Android Sharesheet. Crie um ChooserAction com ChooserAction.Builder. Você pode especificar um PendingIntent como a ação invocada quando o ícone é clicado. Crie uma matriz contendo todas as ações personalizadas e especifique-a como EXTRA_CHOOSER_CUSTOM_ACTIONS da Intent de compartilhamento.

fun customActions(context: Context, text: String) {
    val sendIntent = Intent(ACTION_SEND)
        .setType("text/plain")
        .putExtra(Intent.EXTRA_TEXT, text)
    val shareIntent = Intent.createChooser(sendIntent, null)
    val customActions = arrayOf(
        ChooserAction.Builder(
            Icon.createWithResource(context, R.drawable.ic_logo),
            "Custom",
            PendingIntent.getBroadcast(
                context,
                1,
                Intent(Intent.ACTION_VIEW),
                PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
            )
        ).build()
    )
    shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions)
    context.startActivity(shareIntent)
}

Usar o resolvedor de intents do Android

Captura de tela do resolvedor de intents ACTION_SEND.

O resolvedor de intents do Android é melhor usado ao enviar dados para outro app como parte de um fluxo de tarefas bem definido.

Para usar o resolvedor de intents do Android, crie uma intent e adicione elementos extras como você faria para chamar o Android Sharesheet. No entanto, não chame Intent.createChooser().

Se houver vários aplicativos instalados com filtros que correspondem a ACTION_SEND e ao tipo MIME, o sistema vai mostrar uma caixa de diálogo de desambiguação chamada resolvedor de intents , que permite que o usuário escolha um destino de compartilhamento. Se um único aplicativo for correspondente, ele será executado.

Veja um exemplo de como usar o resolvedor de intents do Android para enviar texto:

fun intentResolver(context: Context) {
    val sendIntent: Intent = Intent().apply {
        action = ACTION_SEND
        putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
        type = "text/plain"
    }
    context.startActivity(sendIntent)
}

Saiba mais

Para mais informações sobre o envio de dados, consulte Intents e filtros de intents.