动态更改通知的操作图标

7

你好朋友,你有收到任何线程吗? - ranjith
@user1672337 不,目前唯一的解决方案是每次想要更改图标时重新创建通知。如果您有任何答案,请写下来。 - user3184899
在小的暂停/播放图标的情况下,您可以使用扩展器中的setContentIcon(int)方法来放置自己的图标。 - user3184899
3个回答

3
您可以从notificationObj.actions访问通知操作。
请尝试以下操作:(注意:下面的代码不完整,但它会给你一个改变操作图标的想法)
Notification status = null;
private NotificationCompat.Builder mBuilder;
private NotificationManager mManager;
private final int STATUS_ID = 1;
private String CHANNEL_ID = "channel_name";

private void setUpNotification() {
     mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

     int playOrPause;
     if(isPlaying()) {
       playOrPause = R.drawable.ic_pause;
     } else {
       playOrPause = R.drawable.ic_play;
     }

     if(mBuilder == null) {
          //Setup Builder
          mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID);
          mBuilder.setOngoing(true) 
                    .addAction(playOrPause, "play", pendingIntent1)      // Index 0
                    .addAction(R.drawable.ic_2, "text2", pendingIntent2) // Index 1
                    .addAction(R.drawable.ic_3, "text3", pendingIntent3);// Index 2

         status = mBuilder.build(); 
     } else {
         //Update builder as per your needs

         mBuilder.setContentTitle(title);
         status = mBuilder.build();
         status.actions[0] = new Notification.Action(playOrPause, "play", pendingIntent1);

     }

     startForeground(STATUS_ID, status);

}

1
我能够通过访问builder.mActions来解决同样的问题。这是您添加的所有操作的ArrayList。我修改它而不重新创建builder,调用build似乎会更新此内容。
SDK文档中似乎没有记录这一点,但现在我可以接受。
如果我想到其他内容,我会告诉你的。

0

通过遵循 @Sammer J 的建议,我想出了以下解决方案。

try {
    // mBuilder is a Notification.Builder object.
    Field field = mBuilder.getClass().getDeclaredField("mActions");
    field.setAccessible(true);
    ArrayList<Notification.Action> mActions = (ArrayList<Notification.Action>) field.get(mBuilder);
    if (mActions != null) {
        mActions.set(0, new Notification.Action(R.drawable.ic_action_resume, getString(R.string.button_resume), pendingIntent));
        field.set(mBuilder, mActions);
    }
} catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
}
mNotificationManager.notify(ONGOING_NOTIFICATION_ID, mBuilder.build());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接