Как использовать функцию прямого ответа Android Nougat с NotificationListener?

Мое приложение использует NotificationListener считывать сообщения из различных сторонних приложений, например WhatsApp.

Пока мне удалось отправить ответ, если только один чат не прочитан, код приведен ниже.

Однако в случае с WhatsApp, getNotification().actions возвращает пустой объект, когда более двух чатов не прочитано, так как сообщения связаны вместе. Как вы можете видеть на рисунках ниже, если уведомления расширены, есть возможность отправить прямой ответ, поэтому я уверен, что это возможно, также я думаю, что приложения, такие как PushBullet, используют этот метод.

Как я могу получить доступ к RemoteInput этого уведомления?

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

Некоторое объяснение того, как работает вышеуказанный код: как только уведомление получено, приложение пытается получить действия и проверяет, находится ли имя в заголовке remoteInput (обычно это в формате "Ответить на $NAME"), если это Обнаружено, что Действие сохраняется в классе ReplyIntentSender, который при запуске sendNativeIntent, перебирает все RemoteInputs этого действия и добавляет сообщение к цели. Если более одного чата не прочитано, getNotification().actions возвращает ноль.

Ниже приведены два скриншота: первый, где он работает без проблем, и второй, где он не работает.

Я могу ответить на это сообщение

Я не могу ответить на это сообщение

1 ответ

Вы можете считать это моим предложением. Я провел небольшое исследование по этому вопросу и пришел к следующим выводам (также похоже, что вы провели много исследований по этому вопросу, поэтому возможно, что вы знаете о том, что я написал ниже)

Многочисленные приложения отправляют определенные уведомления Wear, и многие из них содержат действия, доступные с устройства Android Wear. Мы можем получить эти уведомления об износе на устройстве, извлекая действия, находя ответное действие (если оно существует), заполняя его собственным ответом, а затем выполняя PendingIntent который отправляет наш ответ обратно исходное приложение для отправки получателю.

Для этого вы можете обратиться по этой ссылке (хороший обходной путь от Роба Дж). Вы также можете сослаться на эту ссылку в этом контексте (Большая исследовательская работа, выполненная Михалем Таджхертом).(Возможно, вам придется поработать с NotificationCompat.isGroupSummary)

Это то, что я чувствую (возможно, я совершенно неправ)

.actions Метод возвращает массив всех структур Notification.Action, прикрепленных к текущему уведомлению с помощью addAction(int, CharSequence, PendingIntent). Здесь метод addAction является устаревшим, поэтому он может работать не так, как задумано.

Я не могу проверить это с моей стороны, иначе я буду рад предоставить работающее решение с кодом.

Надеюсь, что это поможет вам. Удачного кодирования!!!

Другие вопросы по тегам