Android - удалить кнопку действия из уведомления

Я хочу удалить кнопки действия уведомления (а не все уведомления) при нажатии на эти кнопки действий. (Скажем: уведомление о загрузке с кнопкой остановки действия. Когда вы нажимаете кнопку "Остановить", отпустите кнопку "Стоп" и измените contentText на "Загрузить отменено" )

Единственное, что приходит мне на ум - это отменить уведомление и уведомить другого с тем же идентификатором, но это кажется уродливым обходным путем...

Итак, есть ли способ удалить кнопки действий из уведомлений?

(я думаю, что нет необходимости вводить какой-либо код, но я буду, если это необходимо...)

Ответ 1

Если вы используете NotificationCompat.Builder из библиотеки поддержки v4, вы можете просто получить доступ к сборке действий строителя напрямую (к сожалению, никаких публичных мутаторов не предоставляется).

Следующее выполнит трюк (конечно, вы должны обновить повторное уведомление):

NotificationCompat.Builder notifBuilder = NotificationCompat.Builder(context);
...
notifBuilder.mActions.clear();

Ответ 2

Я использую следующее обходное решение:

NotificationCompat.Builder builder = //existing instance of builder
//...
try {
    //Use reflection clean up old actions
    Field f = builder.getClass().getDeclaredField("mActions");
    f.setAccessible(true);
    f.set(builder, new ArrayList<NotificationCompat.Action>());
} catch (NoSuchFieldException e) {
    // no field
} catch (IllegalAccessException e) {
    // wrong types
}

отсюда: https://code.google.com/p/android/issues/detail?id=68063

Ответ 3

У меня была та же проблема и я нашел решение для этого. Я создал другой строитель и добавил два "пустых" действия, например:

builder.addAction(0, null, null);
builder.addAction(0, null, null);

(по одной для каждой кнопки у меня было, поэтому, если у вас их три, назовите ее три раза).

Затем при вызове Notify он удаляет кнопки.

Ответ 4

Несмотря на то, что принятый ответ работает, согласно документации, спроектированный способ сделать это - использовать класс NotificationCompat.Extender. Например, в Котлине:

private val clearActionsNotificationExtender = NotificationCompat.Extender { builder ->
    builder.mActions.clear()
    builder
}

private val notificationBuilder by lazy {
     NotificationCompat.Builder(context)
           .addAction(R.drawable.ic_play_arrow, "Play", playPendingIntent)
}

private fun updateNotification(){
     notificationBuilder
          .extend(clearActionsNotificationExtender) // this will remove the play action
          .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)
}

Ответ 5

NotificationCompat.Builder notifBuilder = NotificationCompat.Builder(context);

удалить кнопку полного действия:

builder.mActions.clear();

для удаления кнопки специального действия:

builder.mActions.remove(index);

в конце концов:

notificationManager.notify(notificationID, builder.build());

Ответ 6

Android предоставляет зону уведомлений для оповещения пользователей о произошедших событиях. Он также предоставляет ящик уведомлений, который пользователь может вывести, чтобы просмотреть более подробную информацию об уведомлении.

Ящик уведомлений состоит из

  • Просмотр (содержит мелочь, деталь, маленькую иконку)
  • Действие (любое действие, которое может произойти в случае, если пользователь нажимает вид ящика уведомлений)

Чтобы настроить уведомление, чтобы его можно было обновить, введите его с идентификатором уведомления, вызвав NotificationManager.notify(ID, уведомление). Чтобы обновить это уведомление после его выпуска, обновите или создайте объект NotificationCompat.Builder, создайте из него объект Notification и выпустите уведомление с тем же идентификатором, который вы использовали ранее.

mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // Sets an ID for the notification, so it can be updated
    int notifyID = 1;
    mNotifyBuilder = new NotificationCompat.Builder(this)
    .setContentTitle("New Message")
    .setContentText("You are downloading some image.")
    .setSmallIcon(R.drawable.ic_stop)
   numMessages = 0;  
  // Start of a loop that processes data and then notifies the user
  ...
  mNotifyBuilder.setContentText("Download canceled")
    .setNumber(++numMessages);
  // Because the ID remains unchanged, the existing notification is
  // updated.
  mNotificationManager.notify(
        notifyID,
        mNotifyBuilder.build());
  ...