You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FCM推送后三星设备桌面应用图标角标不显示问题咨询

针对三星老机型FCM推送角标不显示的解决方案

我之前也碰到过类似的三星老系统机型角标适配问题,尤其是Marshmallow和Nougat版本的设备,结合你的情况,给你几个针对性的解决思路:

1. 适配三星原生BadgeProvider(核心方案)

三星老系统有自己独立的ContentProvider来管理应用角标,ShortcutBadger可能在应用被杀的场景下没有正确调用这个Provider,你可以手动实现适配:

步骤1:添加权限到AndroidManifest.xml

<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>

步骤2:编写三星角标更新方法

在你的FirebaseMessagingService类中添加这个方法,用来直接操作三星的角标Provider:

private void updateSamsungBadge(Context context, int badgeCount) {
    try {
        ContentValues badgeValues = new ContentValues();
        badgeValues.put("package", context.getPackageName());
        // 获取应用启动Activity的类名
        String launchClassName = context.getPackageManager()
                .getLaunchIntentForPackage(context.getPackageName())
                .getComponent()
                .getClassName();
        badgeValues.put("class", launchClassName);
        badgeValues.put("badgecount", badgeCount);

        // 插入/更新角标数据
        context.getContentResolver().insert(
                Uri.parse("content://com.sec.badge/apps"),
                badgeValues
        );
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2. 确保FCM消息能触发你的服务(关键前提)

如果你的推送是纯通知消息,当应用被杀时,系统会直接处理通知显示,不会走到你的FirebaseMessagingService,自然无法执行角标更新代码。你需要:

  • 使用数据消息格式推送,或者通知+数据混合消息
  • 数据消息会在任何状态下(包括应用被杀)触发onMessageReceived方法,这样你就能在这个方法里调用上面的updateSamsungBadge来更新角标

3. 结合ShortcutBadger兜底

虽然你之前用ShortcutBadger无效,但可以结合三星原生方法一起调用,覆盖更多场景:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // 处理消息内容,根据实际需求计算角标数量
    int badgeCount = 1;
    // 先调用ShortcutBadger
    ShortcutBadger.applyCount(this, badgeCount);
    // 再调用三星原生方法兜底
    updateSamsungBadge(this, badgeCount);
    // 显示通知面板的代码...
}

4. 检查设备端权限

虽然可能性较低,但可以提醒用户确认:

  • 进入设备「设置」>「通知」> 找到你的应用 > 确保「角标(徽章)」权限已开启
  • 有些三星设备会把角标权限单独列出来,需要手动开启

总结

核心问题在于三星老系统的角标机制和其他厂商不同,且应用被杀时纯通知消息无法触发你的业务代码。通过切换到数据消息+直接调用三星原生BadgeProvider的方式,基本能解决这个问题。

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

火山引擎 最新活动