Wie verwende ich die Direktantwortfunktion von Android Nougat mit einem NotificationListener?

Meine App verwendet einNotificationListener zum Auslesen von Nachrichten aus verschiedenen Apps von Drittanbietern, z. B. WhatsApp.

Bisher konnte ich eine Antwort senden, wenn nur ein Chat ungelesen ist. Der Code ist unten.

Allerdings, im Fall von WhatsApp,getNotification().actions gibt ein Null-Objekt zurück, wenn mehr als zwei Chats ungelesen sind, da die Nachrichten gebündelt sind. Wie Sie in den Bildern unten sehen können, gibt es bei erweiterten Benachrichtigungen auch die Möglichkeit, eine direkte Antwort zu senden. Daher bin ich mir sicher, dass dies möglich ist. Ich denke auch, dass Apps wie PushBullet diese Methode verwenden.

Wie kann ich auf den RemoteInput dieser Benachrichtigung zugreifen?

public static ReplyIntentSender sendReply(StatusBarNotification statusBarNotification, String name) {

            Notification.Action actions[] = statusBarNotification.getNotification().actions;

            for (Notification.Action act : actions) {
                if (act != null && act.getRemoteInputs() != null) {
                    if (act.title.toString().contains(name)) {
                        if (act.getRemoteInputs() != null)
                            return new ReplyIntentSender(act);
                    }
                }
            }
            return null;
        }



public static class ReplyIntentSender {
      [...]

    public final Notification.Action action;

    public ReplyIntentSender(Notification.Action extractedAction) {
            action = extractedAction;
     [...]
    }

private boolean sendNativeIntent(Context context, String message) {
            for (android.app.RemoteInput rem : action.getRemoteInputs()) {
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putCharSequence(rem.getResultKey(), message);
                android.app.RemoteInput.addResultsToIntent(action.getRemoteInputs(), intent, bundle);
                try {
                    action.actionIntent.send(context, 0, intent);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
                return true;
            }
            return false;
        }
    }

Eine Erklärung, wie der obige Code funktioniert: Sobald eine Benachrichtigung eingeht, versucht die App, die Aktionen abzurufen und prüft, ob der Name im Titel eines RemoteInputs enthalten ist (normalerweise im Format "Reply to $ NAME") Das heißt, die Aktion wird in einer ReplyIntentSender-Klasse gespeichert, die bei Auslösung durchsendNativeIntent durchläuft alle RemoteInputs dieser Aktion und fügt die Nachricht der Absicht hinzu. Wenn mehr als ein Chat ungelesen ist,getNotification().actions gibt null zurück.

Below sind zwei Screenshots, der erste, wo es ohne Probleme funktioniert und der zweite, wo es nicht funktioniert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage