Мое приложение использует 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 (обычно оно находится в формате "Reply to $NAME" ), если это обнаружено, действие сохраняется в класс ReplyIntentSender, который при запуске sendNativeIntent
циклически проходит через все удаленные соединения этого действия и добавляет сообщение в намерение. Если несколько чатов не прочитаны, getNotification().actions
возвращает null.
Ниже приведены два скриншота, первый из которых работает без проблем, а второй - там, где он отсутствует.