Assim como um app pode enviar dados para outros apps, ele também pode receber dados de outros e apps. Pense em como os usuários interagem com seu aplicativo e quais dados tipos que deseja receber de outros aplicativos. Por exemplo, uma rede social de rede de computadores pode estar interessado em receber conteúdo de texto, como um um URL da Web interessante de outro aplicativo.
Os usuários de outros apps frequentemente enviam dados para o seu app pelo Android Sharesheet ou do resolvedor de intents. Os apps que enviam dados ao seu app precisam definir um tipo MIME para esses dados. Seu app pode receber dados enviados por outro app na da seguinte maneira:
- Uma
Activity
com uma tagintent-filter
correspondente no manifesto - Atalhos de compartilhamento publicados pelo seu app.
Os alvos 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 de texto pode oferecer um alvo de compartilhamento direto para alguém que tem link direto para uma conversa com essa pessoa. Consulte Forneça metas de compartilhamento direto para instruções.
Suporte a tipos MIME
O ideal é que um aplicativo 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.
o ideal é oferecer suporte ao recebimento de text/*
, image/*
e video/*
. Estes são alguns
tipos MIME comuns para enviar e receber dados simples no Android.
Os receptores se registram | Remetentes enviam |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Extensões de arquivo compatíveis | application/pdf |
Consulte o registro oficial IANA de tipos MIME de mídia.
Criar excelentes alvos de compartilhamento
Quando um usuário toca em um alvo de compartilhamento associado a uma atividade específica que ele deve 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
O recebimento de dados com uma atividade envolve atualizar seu manifesto, processar o o conteúdo recebido e garantir que o usuário reconheça seu aplicativo.
Atualizar seu manifesto
Os filtros de intents informam ao sistema quais intents um componente do app aceita.
Assim como você criou uma intent com uma ação ACTION_SEND
no
Como enviar dados simples para outros apps
você vai criar filtros de intent para receber intents com essa ação. Você
definir 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
incluir uma ou mais imagens de qualquer tipo será semelhante a 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 aplicativo tenta compartilhar qualquer uma dessas coisas construindo uma
e transmitindo-a para startActivity()
, seu aplicativo
estiver listado como uma opção no Android Sharesheet ou no resolvedor de intents. Se o usuário
seleciona seu app, isso inicia a atividade correspondente (.ui.MyActivity
em
o exemplo anterior). Cabe a você cuidar do conteúdo de forma adequada.
no 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,
você pode examinar o conteúdo dele para determinar o que fazer em seguida. Se essa atividade puder
ser iniciado em outras partes do sistema (como a tela de início), pegue este
em consideração ao examinar a intent.
Verifique os dados recebidos com muita atenção, porque nunca se sabe o que outro app 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, e não na principal (interface).
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 } }
Atualizar a interface depois de receber os dados pode ser tão simples quanto preencher uma
EditText
ou mais
complicada como aplicar um filtro interessante de foto a uma imagem. Você decide
o que acontece em seguida.
Garantir que os usuários reconheçam seu app
Seu app é representado pelo icon e label na classe Sharesheet e resolvedor de intents. Ambos são definidos no manifesto. Você pode defina rótulos de atividade ou filtro de intent para fornecer mais contexto.
A partir do Android 10 (API de nível 29), o Android Sharesheet usa apenas os ícones definidos em
o manifesto na tag application
. O Android ignora os ícones definidos em
Tags intent-filter
e activity
.