Recibiendo contenido de otras aplicaciones

De igual forma que tu aplicación puede enviar datos a otras aplicaciones, también puede recibir datos de otras aplicaciones. Piensa en cómo interactúan los usuarios con tu aplicación, y qué tipos de datos quieres recibir de otras aplicaciones. Por ejemplo, si desarrollas una aplicación para una red social seguramente estés interesado en recibir texto de otra aplicación, como una URL de una página interesante. La aplicación Google+ de Android acepta tanto texto como una o varias imágenes. Con esta aplicación, un usuario puede crear fácilmente una nueva entrada en Google+ usando fotografías de la aplicación de Galería de Android.

Actualizar tu manifiesto


Los filtros de intenciones informan al sistema de qué intenciones está dispuesta a aceptar una aplicación. De forma similar a como construías una intención con una acción ACTION_SEND en la lección Enviar contenido a otras aplicaciones usando intenciones, creas filtros de intenciones para poder recibir intenciones con esta acción. Puedes definir un filtro de intención en tu manifiesto usando el elemento <intent-filter>. Por ejemplo, si tu aplicación puede recibir texto, una única imagen de cualquier tipo, o varias imágenes de cualquier tipo, tu manifiesto tendrá este aspecto:

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

Nota: Para más información sobre filtros de intenciones y resolución de filtros lee Intenciones y filtros de intenciones

Cuando otra aplicación intente compartir cualquiera de estos datos construyendo una intención y pasándola a startActivity(), tu aplicación se mostrará en el diálogo de selección de intención. Si el usuario selecciona tu aplicación, se iniciará la actividad correspondiente (.ui.MyActivity en el ejemplo anterior). Luego es cosa tuya gestionar el contenido de forma apropiada en tu código y en tu interfaz de usuario.

Gestionar el contenido recibido


Para gestionar el contenido enviado por un Intent, empieza por llamar a getIntent() para obtener el objeto Intent. Una vez tienes el objeto, puedes examinar su contenido para determinar qué hacer con él. Ten en cuenta que si esta actividad puede iniciarse desde otras partes del sistema, como el lanzador, necesitarás hacer una comprobación cuando examines la intención.

void onCreate (Bundle savedInstanceState) {
    ...
    // Obtenemos la intención, acción y tipo MIME
    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); // Gestionamos el texto que nos han mandado
        } else if (type.startsWith("image/")) {
            handleSendImage(intent); // Gestionamos la imagen que nos han mandado
        }
    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
        if (type.startsWith("image/")) {
            handleSendMultipleImages(intent); // Gestionamos las imágenes que nos han mandado
        }
    } else {
        // Gestionamos otras intenciones, como haber iniciado la actividad desde la pantalla de inicio
    }
    ...
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        // Actualizamos la interfaz para reflejar el texto que nos han compartido
    }
}

void handleSendImage(Intent intent) {
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        // Actualizamos la interfaz para reflejar la imagen que nos han compartido
    }
}

void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        // Actualizamos la interfaz para reflejar las imágenes que nos han compartido
    }
}

Precaución: Ten especial cuidado al comprobar los datos recibidos, nunca se sabe qué aplicación puede haberlos mandado. Por ejemplo, puede tener un tipo MIME incorrecto, o que la imagen que se haya enviado sea extremadamente grande. Recuerda también procesar los datos binarios en un hilo a parte en lugar de usar el hilo principal ("de interfaz de usuario").

Actualizar la interfaz de usuario puede ser tan simple como mostrar el texto en un EditText, o puede ser más complicado como aplicar un filtro de fotografía interesante a una imagen. Lo que ocurra a continuación es muy específico de tu aplicación.