Отменить уведомление, если удаленный вход не работает

Я показываю уведомление с 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);
Другие вопросы по тегам