Cómo recibir datos simples de otras apps

Así como una app puede enviar datos a otras apps, también puede recibirlos de ellas. Piensa en la manera en que los usuarios interactúan con tu aplicación y qué tipos de datos quieres recibir de otras. Por ejemplo, una aplicación de red social podría estar interesada en recibir de otra app contenido de texto, como una URL web interesante.

Los usuarios de otras apps suelen enviar datos a tu app a través de Android Sharesheet o el agente de resolución de intents. Las apps que envían datos a tu app deben establecer un tipo de MIME para esos datos. Tu app puede recibir datos enviados por otra app de las siguientes maneras:

  • Un elemento Activity con una etiqueta intent-filter correspondiente en el manifiesto
  • Accesos directos de uso compartido publicados por tu app,

Los objetivos de uso compartido directo son vínculos directos a una actividad específica dentro de tu app. Suelen representar a una persona o un grupo, y Android Sharesheet los muestra. Por ejemplo, una app de mensajería puede proporcionar a una persona un objetivo de uso compartido directo que contenga un vínculo directo a una conversación con esa persona. Para obtener instrucciones detalladas, consulta Cómo proporcionar objetivos de uso compartido directo.

Compatibilidad con tipos de MIME

Lo ideal es que una app pueda recibir la mayor variedad de tipos de MIME posible. Por ejemplo, una app de mensajería diseñada para enviar texto, imágenes y video debería poder recibir text/*, image/* y video/*. A continuación, puedes ver algunos tipos de MIME comunes que se usan para enviar y recibir datos simples en Android.

Los receptores se registran para Los emisores 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 la IANA de los tipos de medio MIME.

Cómo crear grandes objetivos de uso compartido

Cuando un usuario presiona un objetivo de uso compartido asociado con 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

Para recibir datos con una actividad, debes actualizar tu manifiesto, administrar el contenido entrante y asegurarte de que el usuario reconozca tu app.

Actualiza tu manifiesto

Los filtros de intents informan al sistema qué intents acepta un componente de la app. Así como construiste un intent con una acción ACTION_SEND en la lección Cómo enviar datos simples a otras apps, puedes crear filtros de intents para recibir intents con esta acción. Se define el filtro de intents en tu manifiesto con el elemento <intent-filter>. Por ejemplo, si tu app puede recibir 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 intente compartir cualquiera de estos elementos construyendo un intent y pasándolo a startActivity(), tu aplicación aparecerá como opción en Android Sharesheet o el agente de resolución de intents. Si el usuario selecciona tu app, se iniciará la actividad correspondiente (.ui.MyActivity en el ejemplo anterior). Luego, dependerá de ti que manejes correctamente el contenido dentro de tu IU y código.

Cómo administrar el contenido entrante

Para administrar 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 puede iniciarse desde otras partes del sistema (como el selector), tenlo presente cuando examines el intent.

Presta especial atención a revisar los datos entrantes, nunca se sabe qué podría enviarte otra aplicación. 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 separado en lugar del subproceso principal ("IU").

@Composable
fun SharesheetHandler() {
    val context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        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_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
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

La actualización de la IU después de recibir los datos puede ser tan simple como completar un EditTexto puede resultar más complicada, como cuando se aplica un filtro de foto interesante a una imagen. Tú decides qué sucede luego.

Uso compartido de URL de capturas de pantalla

Cuando tomas una captura de pantalla, puedes compartirla y cualquier URL asociada. Esto proporciona una experiencia del usuario más enriquecedora. Cuando recibas una URL, asegúrate de obtener el campo EXTRA_TEXT del intent, 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 ViewModel state to change state image being shared and the EXTRA_TEXT
    // if available
}

Cómo asegurarte de que los usuarios reconozcan tu app

El ícono y la etiqueta de tu app la representan en Android Sharesheet y en el agente de resolución de intents. Ambos se definen en el manifiesto. Puedes establecer etiquetas de filtros de intent o actividad para brindar más contexto.

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