You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

常见错误修复

  1. 权限缺失:在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"/>
  1. 组件名错误:确保所有厂商逻辑中的className是你的启动Activity完整类名(含子包路径)。

  2. 计数逻辑混乱:确保收到通知时计数+1,用户打开应用/点击通知时重置/递减计数。

内容的提问来源于stack exchange,提问作者jay raman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:05:53