如何利用NotificationListener使用Android Nougat的直接回复功能?

时间:2016-11-01 22:17:49

标签: android android-7.0-nougat notification-listener remote-input

我的应用正在使用NotificationListener来读取各种第三方应用的消息,例如WhatsApp。

到目前为止,如果只有一个聊天未读,我就可以发送回复,代码在下面。

但是,在使用WhatsApp的情况下,getNotification().actions在未读取两个以上的聊天时返回一个空对象,因为消息被捆绑在一起。正如您在下面的图片中看到的,如果通知被扩展,还有一个选项可以发送直接回复,因此我确信可以使用它,我认为像PushBullet这样的应用程序正在使用这种方法。 / p>

我如何访问该通知的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”)如果找到,则将Action保存到ReplyIntentSender类中,该类在由sendNativeIntent触发时循环遍历该Action的所有RemoteInput并将消息添加到intent。如果未读取多个聊天,getNotification().actions将返回null。

下面是两个屏幕截图,第一个是没有任何问题的,第二个没有任何问题。

I can reply to this message

I cannot reply to this message

1 个答案:

答案 0 :(得分:1)

您可以将此视为我的建议。我对此进行了一些研究并得出了以下结论。(看起来你已经对此进行了大量的研究,所以你可能知道我在下面写的内容)

许多应用发送Wear特定通知,其中许多包含可从Android Wear设备访问的操作。我们可以在设备上获取这些Wear通知,提取操作,找到回复操作(如果存在),使用我们自己的响应填充它,然后执行PendingIntent将我们的响应发送回原来的应用程序发送给收件人。

为此,您可以参考this link(Rob J的一个很好的解决方法)。您也可以在此背景下参考this link(MichałTajchert所做的精彩研究工作)。(您可能需要使用NotificationCompat.isGroupSummary

  

这就是我的感受(可能我完全错了)

     

.actions方法返回所有Notification.Action的数组   由addAction(int, CharSequence, PendingIntent)附加到当前通知的结构,此处不推荐使用addAction方法   一个,所以它可能无法正常工作。

我无法在最后测试这个,否则我很乐意提供一个有代码的工作解决方案。

希望这会对你有所帮助。快乐的编码!!!