Android NotificationManager 给我返回“没有有效的小图标”错误

41

我在使用通知管理器时遇到了一个奇怪的错误。

@Override
public void onMessageReceived(String from, Bundle data)
{
     Log.i(TAG, "IP : " + (String) data.get("ip"));
     NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
     Intent acceptNextIntent = new Intent(MainActivity.BROADCAST_KEY_ACCEPT);
//        acceptNextIntent.putExtra("ip", (String) data.get("blah")); //add stuff here
     PendingIntent acceptNextPendingIntent = PendingIntent.getBroadcast(this, 0, acceptNextIntent, 0);

     Intent declineNextIntent = new Intent(MainActivity.BROADCAST_KEY_DECLINE);
     PendingIntent declineNextPendingIntent = PendingIntent.getBroadcast(this, 0, declineNextIntent, 0);

     NotificationCompat.Action acceptAction = new NotificationCompat.Action
                .Builder(R.drawable.common_signin_btn_icon_disabled_focus_light, "Grant Request", acceptNextPendingIntent).build();

     NotificationCompat.Action declineAction = new NotificationCompat.Action
                .Builder(R.drawable.common_signin_btn_icon_focus_dark, "Decline Request", declineNextPendingIntent).build();

     NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setContentTitle("New Password Request From " + (String) data.get("ip"))
                .addAction(acceptAction)
                .addAction(declineAction);

     notificationManager.notify(1, notification.build()); //ERROR HERE

错误信息:

9.474 9327-9371/com.inh.amnesia_application I/MyGcmListenerService: IP : 128.239.213.39
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: Process: com.inh.amnesia_application, PID: 9327
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime: java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(pri=0 contentView=com.inh.amnesia_application/0x1090085 vibrate=null sound=null defaults=0x0 flags=0x0 color=0x00000000 actions=2 vis=PRIVATE)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at android.app.NotificationManager.notify(NotificationManager.java:222)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at android.app.NotificationManager.notify(NotificationManager.java:194)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.inh.amnesia_application.MyGcmListenerService.onMessageReceived(MyGcmListenerService.java:65)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.android.gms.gcm.GcmListenerService.zzt(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.android.gms.gcm.GcmListenerService.zzk(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.android.gms.gcm.GcmListenerService.zza(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at com.google.android.gms.gcm.GcmListenerService$1.run(Unknown Source)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-10 19:49:59.477 9327-9371/com.inh.amnesia_application E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)

这是不是意味着我试图访问的图标不存在?我不确定如何解释这个错误,并且搜索这个错误消息没有任何结果。

4个回答

49

你实际上没有为推送通知设置图标。将.setSmallIcon(R.drawable.your_icon)添加到你的通知中。

 NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
            .setContentTitle("New Password Request From " + (String) data.get("ip"))
            .setSmallIcon(R.drawable.your_icon)
            .addAction(acceptAction)
            .addAction(declineAction);

2
我已经找到了源代码(https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/NotificationManager.java#306),看起来只有目标API > lolipop才会出现错误。 - einverne
2
我在使用通知设置LED时遇到了这个错误,此时图标应该无关紧要,因为它不会被显示... - Michael

10
你还没有在 NotificationCompat.Builder 上调用 setSmallIcon()。这提供了在 Notification 激活时显示在状态栏中的图标。

1
嗨,@CommonsWare,我在一个Service上添加了通知并调用了setSmallIcon()。但仍然出现相同的错误Caused by: java.lang.IllegalArgumentException: Invalid notification (no valid small icon) - AGM Tazim
@AGMTazim:我建议您提出一个单独的Stack Overflow问题,在其中提供一个[mcve],包括您创建“Notification”的代码和结果堆栈跟踪。也许您使用setSmallIcon()时存在与可绘制资源相关的问题。 - CommonsWare

7
根据Android NotificationManager 源代码
if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
    if (notification.getSmallIcon() == null) {
        throw new IllegalArgumentException("Invalid notification (no valid small icon): "
                + notification);
    }
}

当您设置目标API > LOLLIPOP_MR1(22)且通知没有小图标时,才会发生此错误。


1
这突然发生在我的应用程序中。经过一些研究,我发现我的清单文件中的这个更改实际上是导致它发生的原因。
从:
  <uses-sdk android:minSdkVersion="21" />

to:

  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />

我在某个地方看到有人指出,只有在设置了目标SDK版本时才会检查图标。在源代码中确实有这样的内容:

if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
    if (notification.getSmallIcon() == null) {
        throw new IllegalArgumentException("Invalid notification (no valid small icon): "
                + notification);
    }
}

幸运的是,解决方案很简单,只需在清单文件中定义图标即可:
  <application android:label="MyApp" android:icon="@mipmap/icon" >

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