13

Мое приложение использует NotificationListener для чтения сообщений от различных сторонних приложений, например WhatsApp.Как использовать функцию прямого ответа Android Nougat с NotificationListener?

До сих пор я был в состоянии отправить ответ, если только один чат не прочитан, код ниже.

Однако в случае с 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 возвращает null.

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

I can reply to this message

I cannot reply to this message

+0

Вы используете NotificationListenerService или свой пользовательский интерфейс NotificationListener? –

+0

: https://developer.android.com/reference/android/service/notification/NotificationListenerService.html – CristiC777

+0

@PravinDivraniya Я использую обычный NotificationListenerService. – Force

ответ

1

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

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

Для этого вы можете обратиться this link (Хорошее обходное решение Rob J). Вы можете также обратиться this link в этом контексте (Great исследовательской работы, проделанной Михал Tajchert). (Вы, возможно, придется работать вокруг с NotificationCompat.isGroupSummary)

Это то, что я чувствую (Может быть, я совершенно неправильно)

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

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

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

+0

Благодарим вас за ввод, я немного запутался в части «.ISGroupSummary» первой ссылки. Правильно ли, что он не обрабатывает GroupSummaries? – Force

+0

Он используется для идентификации нескольких уведомлений, отправленных приложением одновременно. В первой ссылке с использованием .isGroupSummary определите уведомление об износе, возьмите его и извлеките из него действия и удаленный ввод от него и отправьте ответ. –

+0

@Force Надеюсь, этот ответ вам поможет. –