Android NotificationManager 给我 "no valid small icon" 错误
Android NotificationManager giving me "no valid small icon" error
通知管理器出现奇怪的错误。
@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.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)
这是否意味着我尝试访问的图标不存在?我不确定如何解释此错误并且搜索此错误消息没有任何结果。
您还没有打电话给 setSmallIcon()
on the NotificationCompat.Builder
。这提供了在 Notification
处于活动状态时将出现在状态栏中的图标。
您实际上没有为推送通知设置图标。将 .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);
根据 Android NotificationManager Source Code
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) 并且通知没有小图标时发生。
我的应用程序突然开始出现这种情况。经过一些研究,我发现我的清单文件中的这个更改实际上是导致它的原因。
来自:
<uses-sdk android:minSdkVersion="21" />
至:
<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" >
通知管理器出现奇怪的错误。
@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.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)
这是否意味着我尝试访问的图标不存在?我不确定如何解释此错误并且搜索此错误消息没有任何结果。
您还没有打电话给 setSmallIcon()
on the NotificationCompat.Builder
。这提供了在 Notification
处于活动状态时将出现在状态栏中的图标。
您实际上没有为推送通知设置图标。将 .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);
根据 Android NotificationManager Source Code
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) 并且通知没有小图标时发生。
我的应用程序突然开始出现这种情况。经过一些研究,我发现我的清单文件中的这个更改实际上是导致它的原因。
来自:
<uses-sdk android:minSdkVersion="21" />
至:
<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" >