Cómo recibir datos simples de otras apps

Así como una app puede enviar datos a otras apps, también puede recibir datos de otras apps. Piensa en cómo interactúan los usuarios con tu aplicación y qué tipos de datos deseas recibir de otras aplicaciones. Por ejemplo, una aplicación de redes sociales podría estar interesada en recibir contenido de texto, como una URL web interesante, de otra app.

En una app que usa Compose Navigation, recibir datos enviados por otra app es un proceso de dos pasos:

  1. Declara un <intent-filter> en el manifiesto: Aún debes agregar un filtro de intents a tu actividad en el archivo AndroidManifest.xml. Esto le indica al SO Android que tu aplicación puede recibir acciones específicas (como ACTION_SEND) y tipos de MIME (como text/plain).

  2. Define un navDeepLink en tu gráfico de navegación de Compose: En lugar de interceptar y analizar manualmente el Intent dentro de los métodos onCreate o onNewIntent de tu Activity, usa la compatibilidad con vínculos directos de Compose Navigation. Adjunta un navDeepLink que coincida con la acción y el tipo de MIME directamente al destino componible que debería mostrar el contenido. El NavController interceptará automáticamente el Intent y dirigirá al usuario directamente a esa pantalla.

Los destinos de Direct Share son vínculos directos a una Activity específica dentro de tu app. A menudo, representan a una persona o un grupo, y el Android Sharesheet los muestra. Por ejemplo, una app de mensajería puede proporcionar un destino de Compartir directamente para una persona que se vincula directamente a una conversación con esa persona. Consulta Cómo proporcionar objetivos de Direct Share para obtener instrucciones detalladas.

Tipos de MIME admitidos

Idealmente, una app debe poder recibir la mayor variedad posible de tipos de MIME. Por ejemplo, una app de mensajería diseñada para enviar texto, imágenes y videos debería admitir la recepción de text/*, image/* y video/*. A continuación, se indican algunos tipos de MIME comunes para enviar y recibir datos simples en Android.

Los receptores se registran para Los remitentes envían
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensiones de archivo compatibles application/pdf

Consulta el registro oficial de tipos de medios MIME de IANA.

Crea objetivos de uso compartido excelentes

Cuando un usuario presiona un destino de uso compartido asociado a una actividad específica, debería poder confirmar y editar el contenido compartido antes de usarlo. Esto resulta particularmente importante para datos de texto.

Cómo recibir datos con una actividad

Recibir datos con una actividad implica actualizar tu manifiesto, controlar el contenido entrante y garantizar que el usuario reconozca tu app.

Actualiza tu manifiesto

Los filtros de intents informan al sistema qué intents acepta un componente de la app. De manera similar a cómo creaste un intent con una acción ACTION_SEND en la lección Cómo enviar datos simples a otras apps, crearás filtros de intents para recibir intents con esta acción. Debes definir un filtro de intents en tu manifiesto con el elemento <intent-filter>. Por ejemplo, si tu app controla la recepción de contenido de texto, un manifiesto que incluya una o más imágenes de cualquier tipo se vería como el siguiente fragmento:

<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>

Cuando otra app intenta compartir cualquiera de estos elementos construyendo un intent y pasándolo a startActivity(), tu aplicación aparece como una opción en la hoja para compartir de Android o en el solucionador de intents. Si el usuario selecciona tu app, se inicia la actividad correspondiente (.ui.MyActivity en el ejemplo anterior). Luego, depende de ti controlar el contenido de forma adecuada en tu código y en la IU.

Cómo administrar el contenido entrante

Para controlar el contenido que entrega un Intent, llama a getIntent() para obtener el objeto Intent. Una vez que tengas el objeto, puedes examinar su contenido para determinar qué hacer a continuación. Si esta actividad se puede iniciar desde otras partes del sistema (como el selector), ten esto en cuenta cuando examines el intent.

Ten especial cuidado al verificar los datos entrantes, ya que nunca sabes qué otra aplicación puede enviarte. Por ejemplo, podría estar configurado el tipo de MIME incorrecto o la imagen enviada podría ser extremadamente grande. Además, recuerda procesar los datos binarios en un subproceso independiente en lugar del subproceso principal ("IU").

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                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
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

Actualizar la IU después de recibir los datos puede ser tan simple como completar un TextField, o puede ser más complicado, como aplicar un filtro de fotos interesante a una imagen. Depende de tu app lo que sucederá a continuación.

Compartir URLs de capturas de pantalla

Cuando tomas una captura de pantalla, puedes compartirla y cualquier URL asociada. Esto proporciona una experiencia del usuario más enriquecida. Cuando recibas una URL, asegúrate de obtener el campo EXTRA_TEXT de la intención, como se muestra en el siguiente ejemplo:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

Cómo asegurarte de que los usuarios reconozcan tu app

Tu app está representada por su ícono y su etiqueta en la hoja para compartir y el solucionador de intents de Android. Ambos se definen en el manifiesto. Puedes establecer etiquetas de actividad o de filtro de intents para proporcionar más contexto.

A partir de Android 10 (nivel de API 29), Android Sharesheet solo usa los íconos establecidos en el manifiesto en tu etiqueta application. Android ignora los íconos establecidos en las etiquetas intent-filter y activity.