我的应用程序正在使用NotificationListener
读取来自各种 3rd 方应用程序的消息,例如 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”的格式),如果是发现Action被保存到ReplyIntentSender类中,当被触发时sendNativeIntent
,循环遍历该Action的所有RemoteInputs并将消息添加到intent中。如果多个聊天未读,则getNotification().actions
返回 null。
下面是两个屏幕截图,第一个可以正常工作,第二个没有问题。