Как использовать функцию прямого ответа Android Nougat с NotificationListener?
Мое приложение использует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 (обычно это в формате «Ответить на $ NAME»), если это Обнаружено, что Действие сохраняется в классе ReplyIntentSender, который при запускеsendNativeIntent
, перебирает все RemoteInputs этого действия и добавляет сообщение к цели. Если более одного чата не прочитано,getNotification().actions
возвращает ноль
Ниже приведены два снимка экрана: первый, где он работает без проблем, и второй, где он не работает.