O Android usa intents e extras associados para permitir que os usuários compartilhem informações de forma rápida e facilmente usando seus aplicativos 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 seu 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 ao próxima etapa de uma tarefa bem definida. Por exemplo, abrir um PDF pelo app e permitir que os usuários escolher seu visor preferido.
Ao criar uma intent, você especifica a ação que ela vai executar.
O Android usa a ação ACTION_SEND
para enviar dados de uma atividade a outra,
mesmo entre limites de processos. Você precisa especificar
os dados e seu tipo. O sistema identifica automaticamente as atividades compatíveis
que pode receber os dados e os exibir ao usuário. No caso do resolvedor de intents,
se apenas uma atividade puder processar o intent, essa atividade será iniciada imediatamente.
Por que usar o Android Sharesheet
Recomendamos o uso do Android Sharesheet para criar consistência para seus usuários em apps. Não mostrar a lista de destinos de compartilhamento do app nem criar uma lista Variações do Sharesheet.
O Android Sharesheet permite que os usuários compartilhem informações com os pessoa certa, com sugestões de apps relevantes, tudo com 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 a atividade do app e do usuário. que só está disponível para o sistema.
O Android Sharesheet também conta com muitos recursos úteis para desenvolvedores. Por exemplo, é possível faça o seguinte:
- descobrir quando seus usuários concluem um compartilhamento e para onde;
- Adicionar uma
ChooserTarget
personalizada e destinos de app - Oferecer visualizações de conteúdo rich text a partir do Android 10 (nível 29 da API)
- Excluir destinos correspondentes a nomes de componentes específicos
Usar o Android Sharesheet
Para todos os tipos de compartilhamento, crie uma intent e defina a ação dela como
Intent.ACTION_SEND
:
Para exibir o Android Sharesheet, chame
Intent.createChooser()
,
transmitindo o objeto Intent
.
Ela retorna uma versão da intent que sempre exibe o Android Sharesheet.
Enviar conteúdo de texto
O uso mais direto e comum do Android Sharesheet é enviar conteúdo de texto de de uma atividade para outra. Por exemplo, a maioria dos navegadores pode compartilhar o URL do navegador a página como texto em outro aplicativo. Isso é útil para compartilhar um artigo ou site com amigos através do e-mail ou redes sociais. Veja como fazer isso a seguir:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
Opcionalmente, você pode adicionar extras para incluir mais informações, como destinatários de e-mail
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
).
o assunto do e-mail
(EXTRA_SUBJECT
) etc.
Observação: alguns apps de e-mail, como o Gmail, esperam uma
String[]
para extras como
EXTRA_EMAIL
e EXTRA_CC
. Usar
putExtra(String, String[])
para adicioná-las à sua intent.
Enviar conteúdo binário
Compartilhe dados binários usando a ação ACTION_SEND
.
Defina o tipo MIME adequado e coloque um URI para os dados no bloco extra
EXTRA_STREAM
, conforme
como mostrado no exemplo a seguir.
Normalmente, essa opção é usada para compartilhar imagens, mas pode ser usada para compartilhar qualquer tipo de conteúdo binário.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
O aplicativo receptor precisa de permissão para acessar os dados que o Uri
aponta. Há duas maneiras recomendadas de fazer isso:
- Armazene os dados no seu próprio
ContentProvider
, garantindo que os outros têm a permissão correta para acessar seu provedor. O mecanismo preferencial para fornecer acesso é usando permissões por URI, que são temporários e só concedem acesso ao aplicativo receptor. Uma maneira fácil de criarContentProvider
dessa forma é para usar Classe auxiliarFileProvider
. - Use o sistema
MediaStore
. OMediaStore
serve principalmente para tipos MIME de vídeo, áudio e imagem. No entanto, a partir do Android 3.0 (API nível 11), ele também pode armazenar tipos que não sejam de mídia. Para mais informações, consulteMediaStore.Files
: É possível inserir arquivos noMediaStore
usando:scanFile()
, Depois disso,Uri
estilocontent://
adequado para compartilhamento é transmitido para oonScanCompleted()
o retorno de chamada. Depois de adicionado aoMediaStore
do sistema, o conteúdo pode ser acessado por qualquer app no dispositivo.
Usar o tipo MIME correto
Informe o tipo MIME mais específico disponível para os dados que você está
enviar. Por exemplo, use text/plain
ao compartilhar texto simples. Confira alguns
Tipos MIME comuns ao enviar dados simples no Android:
Os receptores se registram | Remetentes enviam |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Extensões de arquivo compatíveis | application/pdf |
Para obter mais informações sobre tipos MIME, consulte a IANA (em inglês) oficial de tipos MIME de mídia.
O Android Sharesheet pode mostrar uma visualização do conteúdo, dependendo do tipo MIME fornecido. Algumas de pré-lançamento estão disponíveis apenas para tipos específicos.
Compartilhar vários conteúdos
Para compartilhar vários conteúdos, use o ACTION_SEND_MULTIPLE
com uma lista de URIs que apontam para o conteúdo. O tipo MIME varia de acordo com a
mistura de conteúdo compartilhado. 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
que processe qualquer tipo de imagem. Embora seja possível compartilhar uma mistura de tipos, nós altamente
desencorajar isso, porque é
não está claro para o destinatário sobre 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:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
Verifique se os objetos Uri
fornecidos apontam
aos dados que um aplicativo receptor pode acessar.
Adicionar conteúdo avançado a visualizações de texto
A partir do Android 10 (API de nível 29), o Android Sharesheet mostra uma visualização do texto sendo
compartilhadas. Em alguns casos, o texto compartilhado pode ser difícil de entender. Considere compartilhar uma
um URL complicado, como https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Uma abordagem
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 para
Intent.EXTRA_TITLE
antes de chamar Intent.createChooser()
, e adicione um
miniatura relevante usando ClipData
.
Observação:o URI do conteúdo da imagem é fornecido por um
FileProvider
, geralmente de um <cache-path>
configurado.
Para mais informações, consulte Como compartilhar arquivos. Certifique-se de dar
O Sharesheet 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:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.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 = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
A visualização vai ficar assim:
Adicionar ações personalizadas à planilha
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 superior do Android Sharesheet, e os apps
pode 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
.
É possível especificar um PendingIntent
como a ação invocada quando o ícone é clicado. Criar
uma matriz contendo todas as suas ações personalizadas e especificá-la como
EXTRA_CHOOSER_CUSTOM_ACTIONS
do compartilhamento de Intent
.
Kotlin
val sendIntent = Intent(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_custom_action), "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)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Adicionar destinos personalizados
O Android Sharesheet permite especificar até dois objetos ChooserTarget
que
são mostrados antes dos atalhos de compartilhamento e dos alvos do seletor carregados de ChooserTargetServices
. Você também pode
especificar até duas intents que apontem para as atividades listadas
antes das sugestões de apps:
Adicionar Intent.EXTRA_CHOOSER_TARGETS
e Intent.EXTRA_INITIAL_INTENTS
a
Sua intenção de compartilhamento após a chamada
Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Use esse recurso com cuidado. Cada Intent
personalizado
e ChooserTarget
que você adiciona reduz o número sugerido pelo sistema. Geralmente,
desencorajar a adição de segmentações personalizadas. Um exemplo comum da adição de
Intent.EXTRA_INITIAL_INTENTS
serve para disponibilizar outras ações que os usuários podem realizar em conjuntos
conteúdo. Por exemplo, um usuário compartilha imagens, e Intent.EXTRA_INITIAL_INTENTS
é usado para
deixe-os enviar um link. Um exemplo comum da adição de Intent.EXTRA_CHOOSER_TARGETS
é mostrar pessoas ou dispositivos relevantes que seu app oferece.
Excluir destinos específicos por componente
É possível excluir destinos específicos fornecendo Intent.EXTRA_EXCLUDE_COMPONENTS
.
Faça isso apenas para remover os destinos sobre os quais você tem controle. Um caso de uso comum é ocultar
metas de compartilhamento do app quando seus usuários compartilham de dentro dele, já que a intenção deles provavelmente compartilhará
fora do app.
Adicione Intent.EXTRA_EXCLUDE_COMPONENTS
à intent depois de chamar Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Receber informações sobre o compartilhamento
Pode ser útil saber quando seus usuários estão compartilhando e qual é o público-alvo deles. A
O Android Sharesheet permite acessar essas informações fornecendo o ComponentName
do
segmenta seus usuários selecionados usando um IntentSender
.
Primeiro, crie um PendingIntent
para uma BroadcastReceiver
e forneça o
IntentSender
em Intent.createChooser()
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
Receba o callback em MyBroadcastReceiver
e procure em
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Adicionar ações personalizadas à planilha
No Android 14 (nível 34 da API) e versões mais recentes, os apps podem adicionar ações personalizadas ao Android Sharesheet.
Criar um ChooserAction
com
ChooserAction.Builder
.
É possível especificar um PendingIntent
como a ação invocada quando o ícone é clicado. Criar
uma matriz contendo todas as suas ações personalizadas e especificá-la como
EXTRA_CHOOSER_CUSTOM_ACTIONS
do compartilhamento de Intent
.
Kotlin
val sendIntent = Intent(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_custom_action), "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)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Usar o resolvedor de intents do Android
O resolvedor de intents do Android é mais adequado para 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 extras como faria para chamar
no Android Sharesheet. No entanto, não chame
Intent.createChooser()
Se houver vários aplicativos instalados com filtros correspondentes
ACTION_SEND
e o tipo MIME, o sistema exibe uma caixa de diálogo de desambiguação chamada resolvedor de intents.
que permite ao usuário escolher
um destino de compartilhamento. Se um único aplicativo
corresponder, ele é executado.
Veja um exemplo de como usar o resolvedor de intents do Android para enviar texto:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
Saiba mais
Para mais informações sobre como enviar dados, consulte Intents e filtros de intent.