Android Firebase通知图标角标计数实现及错误解决
Android Firebase推送通知图标角标实现方案
核心问题说明
Android平台没有统一的通知角标系统API,不同品牌厂商(小米、华为、OPPO、VIVO、三星等)都有各自的私有实现逻辑,这是你尝试多种方法无效的主要原因。以下是结合你的现有代码,实现角标计数的具体步骤和错误修复方案。
第一步:添加通知计数存储逻辑
先通过SharedPreferences持久化维护未读通知数:
// 获取当前未读通知数 private int getUnreadCount() { SharedPreferences sp = getSharedPreferences("notification_count", MODE_PRIVATE); return sp.getInt("unread_count", 0); } // 更新未读通知数 private void updateUnreadCount(int count) { SharedPreferences.Editor editor = getSharedPreferences("notification_count", MODE_PRIVATE).edit(); editor.putInt("unread_count", count); editor.apply(); }
第二步:添加各厂商角标设置逻辑
在MyFirebaseMessageService中添加以下方法,适配主流厂商的角标更新规则:
// 更新应用图标角标 private void updateAppBadge(int count) { // 小米 try { Intent intent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE"); intent.putExtra("android.intent.extra.update_application_component", getPackageName() + "/" + getPackageName() + ".MainActivity"); intent.putExtra("android.intent.extra.update_application_message_count", count); sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } // 华为 try { Bundle bundle = new Bundle(); bundle.putString("package", getPackageName()); bundle.putString("class", getPackageName() + ".MainActivity"); bundle.putInt("badgenumber", count); getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bundle); } catch (Exception e) { e.printStackTrace(); } // OPPO try { Intent intent = new Intent("com.oppo.unsettledevent"); intent.putExtra("pakeageName", getPackageName()); intent.putExtra("number", count); intent.putExtra("upgradeNumber", count); sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } // VIVO try { Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM"); intent.putExtra("packageName", getPackageName()); intent.putExtra("className", getPackageName() + ".MainActivity"); intent.putExtra("notificationNum", count); sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } // 三星 try { Bundle extra = new Bundle(); extra.putInt("appId", getApplicationInfo().uid); extra.putString("package", getPackageName()); extra.putString("className", getPackageName() + ".MainActivity"); extra.putInt("badgenumber", count); getContentResolver().call(Uri.parse("content://com.sec.badge/apps"), "setBadge", null, extra); } catch (Exception e) { e.printStackTrace(); } }
第三步:修改现有通知创建逻辑
在createNotification方法末尾,更新计数并触发角标更新:
// 替换原有的notify代码 int currentCount = getUnreadCount() + 1; updateUnreadCount(currentCount); updateAppBadge(currentCount); notificationManager.notify((int) post_id, notificationBuilder.build());
第四步:处理角标重置逻辑
用户打开应用时,重置角标计数。在MainActivity的onResume方法中添加:
@Override protected void onResume() { super.onResume(); // 重置未读计数 SharedPreferences.Editor editor = getSharedPreferences("notification_count", MODE_PRIVATE).edit(); editor.putInt("unread_count", 0); editor.apply(); // 调用角标更新方法重置为0 // 可直接将updateAppBadge方法复制到MainActivity,或通过Service调用 updateAppBadge(0); }
常见错误修复
- 权限缺失:在
AndroidManifest.xml添加厂商权限:
<!-- 华为角标权限 --> <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/> <!-- OPPO角标权限 --> <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/> <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/> <!-- VIVO角标权限 --> <uses-permission android:name="com.vivo.notification.permission.BADGE_ICON"/>
组件名错误:确保所有厂商逻辑中的
className是你的启动Activity完整类名(含子包路径)。计数逻辑混乱:确保收到通知时计数+1,用户打开应用/点击通知时重置/递减计数。
内容的提问来源于stack exchange,提问作者jay raman
相关产品推荐
相关产品推荐

