Отменить уведомление, если удаленный вход не работает
Я показываю уведомление с RemoteInput
как это:
RemoteInput remoteInput = new RemoteInput.Builder("key_add_note")
.setLabel("add note")
.build();
PendingIntent AddNotePendingIntent =
PendingIntent.getBroadcast(getApplicationContext(),
(int) txn.get_id(),
new Intent(getApplicationContext(), AddNoteBroadcastReceiver.class)
.putExtra(Constants.IntentExtras.STA_TXN_ID, txn.get_id()),
PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action action =
new NotificationCompat.Action.Builder(R.drawable.ic_action_edit_dark,
"add note", AddNotePendingIntent)
.addRemoteInput(remoteInput)
.build();
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationUtil.MISC_CHANNEL_ID)
.setContentTitle("TEST")
.setContentText("add Note")
.setSmallIcon(R.drawable.ic_action_edit_dark)
.setAutoCancel(true)
.addAction(action);
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(123456, builder.build());
выход:
после нажатия на добавление заметки, ввода текста и его отправки я пытаюсь отменить уведомление следующим образом:
notificationManager.cancel(123456);
который не отменяет уведомление, а просто отклоняет поле ввода с текстом, добавленным под моим уведомлением, вот так:
почему это не отменяет уведомление? и как это отменить.
обновление: те же результаты, даже если есть тег с уведомлением
1 ответ
Через некоторое время я нашел обходной путь, определенно не самый элегантный. Проблема возникает у меня на Android 9, тогда как уведомление с удаленным вводом не может быть отклонено системой. Обходной путь - после того, как пользователь введет текст и щелкнет, и нам нужно обновить пользовательский интерфейс уведомления, чтобы использоватьsetTimeoutAfter()
; даже при значениях всего 1 миллисекунда уведомление удаляется через несколько секунд, поэтому решение не лучшее.
fun updateNotification(context: Context, id: Int) {
val notification = NotificationCompat.Builder(context, MY_CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_action_edit_dark)
.setContentText(MY_TEXT)
.setTimeoutAfter(1)
.build()
// show notification. This hides direct reply UI
NotificationManagerCompat.from(context).notify(id, notification)
}
Когда я создаю уведомление с возможностью ответить внутри него (как в примере сRemoteInput
) и НЕ хотите ЗАМЕНИТЬ его другим уведомлением после ответа:
notificationManager.notify(tag, requestCode, notification);
но просто ОТМЕНИТЬ его сразу после ответа с помощью
notificationManager.cancel(tag, requestCode);
он не пропадает из панели уведомлений.
Более того, когда я пытаюсь узнать список существующих уведомлений ПОСЛЕ выше, отмените с помощью
StatusBarNotification[] barNotifications = notificationManager.getActiveNotifications();
это (все еще не исчезнувшее из панели уведомлений) уведомление ОТСУТСТВУЕТ в списке!!
Эта ошибка появляется только начиная с API 29 и не зависит от того, отвечаю ли я из панели уведомлений или из "хедз-ап".
В качестве обходного пути я должен заменить полученное уведомление, как в руководстве, наRemoteInput
)
notificationManager.notify(tag, requestCode, notification);
подожди пару секунд
Thread.sleep(2000)
и отменить после
notificationManager.cancel(tag, requestCode);
Попробуйте установить тег в своем уведомлении, а затем укажите этот тег при выполнении отмены следующим образом:
При создании (замените my_tag предпочитаемым уникальным тегом):
notificationManager.notify("my_tag",123456, builder.build());
При отмене:
notificationManager.cancel("my_tag",123456);