Android Notification 问题:Invalid notification (no valid small icon)
问题描述与处理策略
1、问题描述
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.notifications/com.my.notifications.MainActivity}:
java.lang.IllegalArgumentException: Invalid notification (no valid small icon):
Notification(channel=simple_channel shortcut=null contentView=null vibrate=null sound=null defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE)
-
在 MainActivity 中创建了一个无效的 Notification 而抛出了 RuntimeException 异常
-
异常的具体原因是 Notification 没有设置的小图标
no valid small icon
-
在 Android 中,每个 Notification 都必须有一个小图标,这是通知的基本组成部分之一
2、处理策略
// 假设原来是这样的
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("通知")
.setContentText("点击跳转到目标页面")
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
// 需要修改成这样的
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("通知")
.setContentText("点击跳转到目标页面")
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
补充学习
1、IllegalArgumentException
(1)基本介绍
-
IllegalArgumentException 是 Java 中的一个运行时异常,它继承自 RuntimeException
-
IllegalArgumentException 通常用于指示传递给方法的参数不符合预期或违反了方法的约定
- IllegalArgumentException 常见的触发场景如下
-
传递了空值(null)给不接受空值的方法参数
-
传递了超出方法参数预期范围的值,例如,不在指定范围内的数值
-
传递了类型不正确或格式不符合要求的参数,例如,将字符串转换为数字时字符串格式不正确
(2)复现
int result = Integer.parseInt("Hello World");
System.out.println(result);
- 输出结果
Exception in thread "main" java.lang.NumberFormatException: For input string: "Hello World"
- 注:NumberFormatException 是 IllegalArgumentException 的子类
public class NumberFormatException extends IllegalArgumentException {
...
}
2、Notification 信息
- 这是一个简化的、用于日志记录或调试的 Notification 字符串表示
Notification(channel=simple_channel shortcut=null contentView=null vibrate=null sound=null defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE)
(1)channel=simple_channel
-
表示 Notification 被分配到了名为
simple_channel
的通知渠道 -
在 Android Oreo(API 级别 26)及更高版本中,所有通知都必须分配到一个通知渠道,这个渠道用于定义通知的行为,例如,重要性、可见性、声音、振动设置等
(2)shortcut=null
- 表示没有为 Notification 设置相关联的快捷方式
(3)contentView=null
-
表示没有为 Notification 设置自定义的布局,如果为 null,则使用系统默认的布局。
-
可以使用 setCustomContentView 方法设置自定义的布局
(4)vibrate=null
-
表示没有为 Notification 设置振动模式,如果为 null,则根据通知渠道的设置来决定是否振动
-
可以使用 setVibrate 方法为通知设置振动模式
(5)sound=null
-
表示没有为 Notification 设置声音,如果为 null,则根据通知渠道的设置来决定是否播放声音
-
可以通过 setSound 方法为 Notification 设置声音
(6)defaults=0x0
-
表示没有为 Notification 设置默认行为
-
defaults 是一个标志位,可以包含多个值,例如,
Notification.DEFAULT_ALL
(应用所有默认行为,例如,声音、振动、灯光),Notification.DEFAULT_LIGHTS
(仅应用灯光默认行为)
(7)flags=0x10
-
表示 Notification 被设置了某些标志
-
flags 是一个标志位,可以包含多个值,例如,
Notification.FLAG_ONGOING_EVENT
(表示 Notification 是一个持续进行的事件,例如,音乐播放),Notification.FLAG_AUTO_CANCEL
(表示当用户点击通知时,通知应该被取消)
(8)color=0x00000000
-
表示 Notification 的颜色被设置为透明(黑色,但透明度为 0%),如果为 null 或设置为透明,则使用系统默认的颜色
-
可以使用 setColor 方法为 Notification 指定一个颜色
(9)vis=PRIVATE
- 可能是日志输出信息的一些其他部分