Bad notification posted from package com.notify: Couldn't create icon

本文介绍了一种在Android应用程序中遇到的通知图标加载失败的问题及其解决方案。该问题源于系统重启时通知图标资源未能及时加载,导致应用程序抛出异常。文中提供了一个实用的方法来规避此问题,即使用应用程序图标作为默认的小图标。

问题:Bad notification posted from package com.notify: Couldn't create icon

09-19 21:10:05.725 1600-1600/? W/ResourceType: No known package when getting value for resource number 0x2714000e
09-19 21:10:05.725 1600-1600/? E/Icon: Unable to load resource 0x2714000e from pkg=com.notify
                                       android.content.res.Resources$NotFoundException: Resource ID #0x2714000e
                                           at android.content.res.ResourcesImpl.getValueForDensity(ResourcesImpl.java:288)
                                           at android.content.res.Resources.getDrawableForDensity(Resources.java:1026)
                                           at android.content.res.Resources.getDrawable(Resources.java:969)
                                           at android.graphics.drawable.Icon.loadDrawableInner(Icon.java:324)
                                           at android.graphics.drawable.Icon.loadDrawable(Icon.java:277)
                                           at android.graphics.drawable.Icon.loadDrawableAsUser(Icon.java:388)
                                           at com.android.systemui.statusbar.StatusBarIconView.getIcon(StatusBarIconView.java:295)
                                           at com.android.systemui.statusbar.StatusBarIconView.getIcon(StatusBarIconView.java:273)
                                           at com.android.systemui.statusbar.StatusBarIconView.updateDrawable(StatusBarIconView.java:259)
                                           at com.android.systemui.statusbar.StatusBarIconView.set(StatusBarIconView.java:221)
                                           at com.android.systemui.statusbar.BaseStatusBar.createIcon(BaseStatusBar.java:2643)
                                           at com.android.systemui.statusbar.BaseStatusBar.createNotificationViews(BaseStatusBar.java:2598)
                                           at com.android.systemui.statusbar.phone.PhoneStatusBar.addNotification(PhoneStatusBar.java:1879)
                                           at com.android.systemui.statusbar.BaseStatusBar$7$2.run(BaseStatusBar.java:798)
                                           at android.os.Handler.handleCallback(Handler.java:808)
                                           at android.os.Handler.dispatchMessage(Handler.java:101)
                                           at android.os.Looper.loop(Looper.java:166)
                                           at android.app.ActivityThread.main(ActivityThread.java:7425)
                                           at java.lang.reflect.Method.invoke(Native Method)
                                           at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
09-19 21:10:05.725 1600-1600/? W/StatusBarIconView: No icon for slot com.notify/0x309
09-19 21:10:05.726 1600-1600/? W/StatusBar: removeNotification for unknown key: 0|com.notify|777|null|10532
09-19 21:10:05.728 1167-1469/? E/AwareLog: RMS.AwareAppAssociate: Unknown EventID: 21
09-19 21:10:05.728 1167-1469/? E/AwareLog: RMS.AwareAppAssociate: Unknown EventID: 21
09-19 21:10:05.729 17885-17885/com.notify W/System.err: android.app.RemoteServiceException: Bad notification posted from package com.notify: Couldn't create icon: StatusBarIcon(icon=Icon(typ=RESOURCE pkg=com.notify id=0x2714000e) visible user=0 )
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2101)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at android.taobao.atlas.runtime.ActivityThreadHook.handleMessage(ActivityThreadHook.java:290)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:104)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at android.os.Looper.loop(Looper.java:166)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7425)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
09-19 21:10:05.729 17885-17885/com.notify W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

 

解决:

1、思路

从这句话中No known package when getting value for resource number 0x2714000e 获取知道,系统运行无法找到0x2714000e对应的资源,通过搜索R.java文件,发现是0x2714000e对应notify.png图片,那么明确是在运行的时候没有找到图片资源。

2、原因

这个问题一般是由于setSmallIcon(R.drawable.notify)时候,在某些情况下(比如开启重启动系统就要发送通知),R.drawable.notify这个资源尚未准备好,导致了App异常。

3、解决

从ApplicationInfo中拿到应用icon当作SmallIcon图片;

setSmallIcon(context.getApplicationInfo().icon) 
 
总结,要抢在系统重启动之前拿到icon,而不至于拿到一个空的resId。

 

<think>好的,我现在要解决用户遇到的Android.Util.AndroidRuntimeException问题。首先,我需要理解错误信息的具体内容。用户提供的错误日志是: Android.Util.AndroidRuntimeException: Bad notification(tag=null, id=1) posted from package com.dnake.intelligence.finesleep, crashing app(uid=10382, pid=30121): Couldn't inflate contentViewsjava.lang.IllegalArgumentException: setShowActionsInCompactView: action 0 out of bounds (max -1) 看起来问题发生在通知的创建过程中,特别是内容视图的膨胀失败。关键点在于`IllegalArgumentException: setShowActionsInCompactView: action 0 out of bounds (max -1)`,这说明在设置通知的紧凑视图中的操作时,索引越界了。max为-1表示没有可用的操作,但代码试图访问第0个操作,导致错误。 接下来,我需要分析可能的原因。首先,用户可能在通知中使用了自定义布局(contentView),但布局可能有问题,比如使用了不支持的控件或错误的资源,导致无法正确膨胀。其次,关于操作按钮的设置,可能在调用`setShowActionsInCompactView`方法时传入了无效的索引,比如当没有添加任何操作时却试图显示第一个操作。 可能的解决步骤包括: 1. **检查通知的自定义布局**:确保所有使用的视图组件在通知中受支持,并且资源正确无误。例如,避免使用标准通知不支持的复杂布局或控件。 2. **验证操作按钮的数量和索引**:在调用`setShowActionsInCompactView(int...)`方法时,传入的索引必须对应已添加的操作按钮的有效位置。如果没有任何操作按钮,或者索引超出实际数量,就会引发异常。需要检查添加的操作数量,并确保传入的索引在合理范围内。 3. **测试不同Android版本的兼容性**:某些API可能在特定版本上有不同的行为,尤其是在处理通知的紧凑视图时。需要确保代码在不同版本上都能正确处理操作按钮的设置。 4. **查看官方文档和示例代码**:参考Android开发者文档中关于通知操作和紧凑视图的部分,确认使用的方法和参数是否符合要求,是否有遗漏或错误。 5. **使用调试工具排查**:在出现问题的代码处设置断点,检查操作列表的大小和传入的索引值,确认是否为空或越界。 总结来说,最可能的原因是通知中没有添加任何操作按钮,但代码却试图在紧凑视图中显示第一个操作(索引0),导致越界异常。需要检查相关代码,确保添加了足够的操作按钮,并在调用`setShowActionsInCompactView`时使用正确的索引。</think>### 错误原因分析: 你遇到的错误属于 **Android通知构建异常**,核心问题出在 `NotificationCompat.Builder` 的 `setShowActionsInCompactView` 方法调用时,指定的操作按钮索引越界。以下是关键点解析: --- ### 1. **错误核心:`max = -1` 与 `action 0` 冲突** - **`max = -1`** 表示当前通知的 **紧凑视图(折叠状态)中未添加任何操作按钮**(Action)。 - **`action 0`** 表示代码尝试显示第1个操作按钮(索引从0开始),但实际没有可用的按钮,导致数组越界。 --- ### 2. 常见触发场景 - 调用 `setShowActionsInCompactView(0)`,但通知中 **未添加任何操作按钮**。 - 添加的操作按钮数量不足(例如添加了1个按钮,但尝试显示索引为1的按钮)。 - 使用 **自定义通知布局** 时,未正确处理操作按钮的绑定。 --- ### 3. 解决方案步骤 #### 步骤 1:检查操作按钮的添加 确保在构建通知时,通过 `addAction()` 添加了至少一个操作按钮: ```java NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("标题") .setContentText("内容") .addAction(R.drawable.ic_action, "按钮1", pendingIntent); // 必须添加至少一个Action ``` #### 步骤 2:验证 `setShowActionsInCompactView` 参数 - **参数必须严格小于已添加的Action数量**。 - 示例:若添加了2个Action,则允许的索引为 `0` 或 `1`。 ```java // 正确用法(假设已添加2个Action) builder.setShowActionsInCompactView(0, 1); // 错误用法(索引超出范围) builder.setShowActionsInCompactView(2); ``` #### 步骤 3:排查自定义布局问题 如果使用了自定义通知布局(通过 `setCustomContentView()`): - 确认布局文件中 **未直接操作操作按钮**(应由系统自动处理)。 - 避免在自定义布局中使用 `setShowActionsInCompactView`,二者可能存在冲突。 #### 步骤 4:检查Android版本兼容性 - `setShowActionsInCompactView` 主要用于 **穿戴式设备(Wear OS)** 的紧凑视图。 - 在手机端通知中可能被忽略,但错误仍可能抛出。建议添加版本判断: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { builder.setShowActionsInCompactView(0); } ``` --- ### 4. 完整示例代码 ```java // 创建PendingIntent(假设已定义) PendingIntent actionIntent = PendingIntent.getActivity(...); // 构建通知 NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("提醒") .setContentText("点击查看详情") .addAction(R.drawable.ic_action, "确认", actionIntent) // 添加至少一个Action .setPriority(NotificationCompat.PRIORITY_HIGH); // 仅在操作按钮存在时设置紧凑视图 if (builder.mActions.size() > 0) { builder.setShowActionsInCompactView(0); } // 发送通知 NotificationManagerCompat.from(context).notify(1, builder.build()); ``` --- ### 5. 扩展排查 - **检查资源ID**:确保 `addAction()` 中的图标资源(如 `R.drawable.ic_action`)存在。 - **避免空PendingIntent**:操作按钮的 `PendingIntent` 不可为 `null`。 - **日志调试**:在调用 `setShowActionsInCompactView` 前打印 `builder.mActions.size()` 确认数量。 通过逐步排查,应能定位到具体是 **操作按钮未添加** 还是 **索引值错误** 导致的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值