当前位置: 首页 > article >正文

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)
  1. 在 MainActivity 中创建了一个无效的 Notification 而抛出了 RuntimeException 异常

  2. 异常的具体原因是 Notification 没有设置的小图标 no valid small icon

  3. 在 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)基本介绍
  1. IllegalArgumentException 是 Java 中的一个运行时异常,它继承自 RuntimeException

  2. IllegalArgumentException 通常用于指示传递给方法的参数不符合预期或违反了方法的约定

  • IllegalArgumentException 常见的触发场景如下
  1. 传递了空值(null)给不接受空值的方法参数

  2. 传递了超出方法参数预期范围的值,例如,不在指定范围内的数值

  3. 传递了类型不正确或格式不符合要求的参数,例如,将字符串转换为数字时字符串格式不正确

(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
  1. 表示 Notification 被分配到了名为 simple_channel 的通知渠道

  2. 在 Android Oreo(API 级别 26)及更高版本中,所有通知都必须分配到一个通知渠道,这个渠道用于定义通知的行为,例如,重要性、可见性、声音、振动设置等

(2)shortcut=null
  • 表示没有为 Notification 设置相关联的快捷方式
(3)contentView=null
  1. 表示没有为 Notification 设置自定义的布局,如果为 null,则使用系统默认的布局。

  2. 可以使用 setCustomContentView 方法设置自定义的布局

(4)vibrate=null
  1. 表示没有为 Notification 设置振动模式,如果为 null,则根据通知渠道的设置来决定是否振动

  2. 可以使用 setVibrate 方法为通知设置振动模式

(5)sound=null
  1. 表示没有为 Notification 设置声音,如果为 null,则根据通知渠道的设置来决定是否播放声音

  2. 可以通过 setSound 方法为 Notification 设置声音

(6)defaults=0x0
  1. 表示没有为 Notification 设置默认行为

  2. defaults 是一个标志位,可以包含多个值,例如,Notification.DEFAULT_ALL(应用所有默认行为,例如,声音、振动、灯光),Notification.DEFAULT_LIGHTS(仅应用灯光默认行为)

(7)flags=0x10
  1. 表示 Notification 被设置了某些标志

  2. flags 是一个标志位,可以包含多个值,例如,Notification.FLAG_ONGOING_EVENT(表示 Notification 是一个持续进行的事件,例如,音乐播放),Notification.FLAG_AUTO_CANCEL(表示当用户点击通知时,通知应该被取消)

(8)color=0x00000000
  1. 表示 Notification 的颜色被设置为透明(黑色,但透明度为 0%),如果为 null 或设置为透明,则使用系统默认的颜色

  2. 可以使用 setColor 方法为 Notification 指定一个颜色

(9)vis=PRIVATE
  • 可能是日志输出信息的一些其他部分

http://www.kler.cn/a/461547.html

相关文章:

  • epoll 水平ET跟边缘LT触发的区别是什么
  • xdoj isbn号码
  • TVS二极管选型【EMC】
  • sqlalchemy-access库操作MS Access
  • Python 测验
  • 前端路由layout布局处理以及菜单交互(三)
  • 读书网(文章内容的抓取)
  • 【Redis知识】Redis进阶-redis还有哪些高级特性?
  • private static final Logger log = LoggerFactory.getLogger()和@Slf4j的区别
  • wpf 基于Behavior库 的行为模块
  • 网络安全 | 物联网安全:从设备到网络的全方位防护
  • day 29 进程exec函数族 ,进程实现无人机模块,exec实现minishell
  • Ribbon和Eureka的集成
  • 黑神话悟空游戏鼠标光标使用教程与下载
  • 探秘Kafka源码:关键内容解析
  • 【Leetcode 热题 100】22. 括号生成
  • 设计模式-创建型模式-工厂模式
  • 【Git_bugs】remote error GH013 Repository rule violations found for.md
  • 【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • 随笔 | 写在2024的最后一天
  • 线程锁和协程锁的区别
  • Redis Stream:实时数据处理的高效解决方案
  • 2分钟知晓Vscode 插件发布流程
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
  • 智能运维分析决策系统:构建高效运维的新篇章