Мое приложение использует 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.
Ниже приведены два скриншота, первый из которых работает без проблем, а второй - там, где нет.
Вы используете NotificationListenerService или свой пользовательский интерфейс NotificationListener? –
: https://developer.android.com/reference/android/service/notification/NotificationListenerService.html – CristiC777
@PravinDivraniya Я использую обычный NotificationListenerService. – Force