notify_listener

Plugin de Flutter para escuchar notificaciones entrantes en Android en tiempo real. Permite capturar, analizar e interactuar con las notificaciones de otras aplicaciones desde segundo plano, ideal para automatización o sistemas de respuesta inteligente.

Homepage: icedigital.pe
Desarrollado por: iCe-Digital

Instalación

dependencies:
  notify_listener: ^1.1.0

Configuración

AndroidManifest.xml

Agrega los permisos:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Registra el servicio dentro de <application>:

<service android:name="com.icedigital.notify_listener.NotificationsHandlerService"
    android:label="Flutter Notifications Handler"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
    android:exported="true"
    android:foregroundServiceType="specialUse">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
    <property
        android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
        android:value="notification_listener" />
</service>

<!-- Para auto-inicio después del reinicio -->
<receiver android:name="com.icedigital.notify_listener.RebootBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

Uso Básico

// Inicializar
await NotificationsListener.initialize();

// Escuchar notificaciones
NotificationsListener.receivePort.listen((NotificationEvent event) {
    print('Nueva notificación: ${event.packageName}');
    print('Título: ${event.title}');
    print('Texto: ${event.text}');
});

// Verificar permisos e iniciar servicio
void startListening() async {
    var hasPermission = await NotificationsListener.hasPermission;
    if (!hasPermission) {
        NotificationsListener.openPermissionSettings();
        return;
    }

    var isRunning = await NotificationsListener.isRunning;
    if (!isRunning) {
        await NotificationsListener.startService();
    }
}

Uso Avanzado

Manejador en segundo plano

@pragma('vm:entry-point')
static void _callback(NotificationEvent evt) {
    // Guardar en base de datos
    // Enviar al hilo UI si es necesario
    final SendPort? send = IsolateNameServer.lookupPortByName("_listener_");
    send?.send(evt);
}

// Registrar al inicializar
NotificationsListener.initialize(callbackHandle: _callback);

Interactuar con notificaciones

// Tocar notificación
if (event.canTap) event.tap();

// Marcar como leída
event.actions.forEach((action) {
    if (action.semantic == 2) { // MARK_AS_READ
        action.tap();
    }
});

// Responder automáticamente
event.actions.forEach((action) {
    if (action.semantic == 1) { // REPLY
        Map<String, dynamic> inputs = {};
        action.inputs.forEach((input) {
            inputs[input.resultKey] = "Respuesta automática";
        });
        action.postInputs(inputs);
    }
});

API Reference

NotificationEvent

  • uniqueId: ID único de la notificación
  • packageName: Paquete de la app que envió la notificación
  • title: Título
  • text: Texto
  • timestamp: Tiempo de publicación
  • largeIcon: Icono grande (Uint8List)
  • canTap: Si puede ser tocada
  • actions: Lista de acciones disponibles

Action

  • id: Índice de la acción
  • title: Título de la acción
  • semantic: Tipo semántico (0-10)
  • tap(): Ejecutar la acción
  • postInputs(): Enviar inputs (para respuestas)

NotificationsListener

  • hasPermission: Verificar permisos
  • isRunning: Estado del servicio
  • initialize(): Inicializar plugin
  • startService(): Iniciar servicio
  • stopService(): Detener servicio
  • openPermissionSettings(): Abrir configuración de permisos

Libraries

notify_listener