Flutter compartir archivos Android
Introducción
Implementar Flutter compartir archivos Android puede parecer sencillo al inicio, pero en la práctica es uno de los casos más complejos cuando se trata de integración con el sistema operativo. Especialmente si necesitas que tu aplicación reciba archivos desde el explorador o desde otras apps, tanto en arranque en frío como con la app abierta.
En este artículo te voy a explicar el problema real que enfrentamos al implementar esta funcionalidad, por qué ocurría, y cómo lo solucionamos paso a paso. Aprenderás cómo funcionan los Android Intents en Flutter, cómo usar correctamente plugins como receive_sharing_intent (documentación oficial) y qué configuraciones son necesarias para lograr una solución robusta.
Si estás trabajando con receive_sharing_intent Flutter Android, manejando archivos como .mhtml, o lidiando con eventos que no se disparan correctamente, este artículo te va a ahorrar horas de debugging.
El problema real al compartir archivos en Flutter Android
Cuando implementas Flutter compartir archivos Android, normalmente utilizas un plugin como receive_sharing_intent, que simplifica la recepción de archivos desde otras aplicaciones. Este plugin permite capturar imágenes, documentos o cualquier archivo enviado mediante intents. (Dart packages)
Sin embargo, el problema aparece cuando intentas cubrir todos los escenarios:
- App cerrada (cold start)
- App abierta (warm start)
- Diferentes apps enviando archivos
- Diferentes tipos de intent (
SEND,VIEW, etc.)
En nuestro caso, todo funcionaba correctamente cuando la app estaba cerrada. Pero cuando la app ya estaba abierta, el archivo no se recibía.
Subproblema: comportamiento inconsistente de Android Intents
Android utiliza Intents para la comunicación entre aplicaciones. Android Intents (documentación oficial)
El problema es que:
getInitialMedia()solo funciona en cold startgetMediaStream()depende de que el intent llegue correctamente
Y aquí es donde empieza el verdadero fallo.
El error clave: onNewIntent en MainActivity
El punto crítico que causa la mayoría de los problemas en Android Intent compartir archivos Flutter es que Flutter no actualiza automáticamente el intent cuando la app ya está abierta.
Cuando un archivo se abre desde otra app:
- Android llama a
onNewIntent() - Pero Flutter no lo procesa si no se actualiza manualmente
Subtema: la solución real
La solución fue agregar esto en MainActivity.kt:
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
}
Este pequeño cambio hace que:
- Flutter reciba el nuevo intent
- El plugin detecte el cambio
getMediaStream()funcione correctamente
Sin esto, el flujo simplemente se rompe en warm start.
Configuración correcta del AndroidManifest
Otro problema importante al trabajar con receive_sharing_intent Flutter Android es la configuración del AndroidManifest.xml.
Muchos desarrolladores cometen el error de usar filtros demasiado restrictivos.
La configuración correcta debe cubrir todos los casos:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
<data android:scheme="content" />
<data android:scheme="file" />
</intent-filter>
Puntos clave:
SEND_MULTIPLEes obligatorio*/*evita problemas con MIME typesVIEWpermite abrir archivos directamente- Evitar filtros demasiado específicos
Esto es fundamental para que Flutter archivos MHTML Android funcione correctamente en distintos dispositivos.
Manejo correcto en Flutter (cold y warm start)
Una vez configurado Android correctamente, debes manejar ambos escenarios en Flutter:
ReceiveSharingIntent.instance.getInitialMedia().then((files) {
// cold start
});
ReceiveSharingIntent.instance.getMediaStream().listen((files) {
// warm start
});
Lista de buenas prácticas:
- Usar ambos métodos siempre
- Evitar duplicados en navegación
- Validar rutas de archivo
- Filtrar extensiones en Flutter (no en Android)
Esto asegura que el flujo de Flutter compartir archivos Android sea estable.
Caso específico: archivos MHTML en Flutter
Trabajar con Flutter archivos MHTML Android agrega complejidad adicional.
Muchos exploradores no envían un MIME correcto, por lo que:
- El archivo llega como
application/octet-stream - O incluso como
*/*
Por eso es mejor:
- Aceptar todos los tipos en Android
- Filtrar en Flutter usando la extensión

Conclusión
Implementar correctamente Flutter compartir archivos Android no es trivial, principalmente por la forma en que Android maneja los intents y cómo Flutter interactúa con ellos.
El problema no estaba en el plugin ni en Flutter directamente, sino en la integración entre ambos. La clave fue entender que Android no actualiza automáticamente el intent cuando la app ya está abierta, y que sin setIntent(intent) el flujo se rompe.
Además, configurar correctamente el AndroidManifest y manejar ambos escenarios en Flutter (cold y warm start) es fundamental para lograr una solución robusta.
Si estás trabajando con Android Intent compartir archivos Flutter o integrando receive_sharing_intent Flutter Android, esta arquitectura te permitirá evitar los errores más comunes.
Como siguiente paso, te recomiendo probar distintos exploradores de archivos, validar los intents recibidos y ajustar tu lógica según el tipo de archivo.
