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

Android Firebase Cloud Messaging:特定设备onTokenRefresh未调用问题

解决FCM onTokenRefresh在API 19设备未触发的问题

我来帮你搞定这个FCM令牌刷新的问题,结合我遇到过的类似情况,给你几个针对性的排查和修复步骤:

1. 优先检查Google Play服务版本

API 19(Android 4.4)设备上的Google Play服务版本很可能是关键——FCM严重依赖Google Play服务,版本过低(比如低于10.2.x)会导致很多功能失效。你可以打开设备上的Google Play商店,找到「Google Play服务」应用,检查并更新到设备能支持的最新版本。

2. 确认Manifest配置是否正确

一定要确保MyFirebaseInstanceIDService在AndroidManifest.xml里注册正确,同时必要权限也不能少:

<!-- 注册InstanceID服务 -->
<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

<!-- FCM所需基础权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

3. 手动触发令牌获取测试

有些旧版本系统上,onTokenRefresh不会自动触发(比如首次安装APP后),你可以在APP初始化的地方(比如Application类或者主Activity的onCreate)主动调用令牌获取逻辑,看看能不能拿到令牌:

// 主动尝试获取FCM令牌
String fcmToken = FirebaseInstanceId.getInstance().getToken();
if (fcmToken == null) {
    // 先删除旧令牌再重新获取
    try {
        FirebaseInstanceId.getInstance().deleteInstanceId();
        fcmToken = FirebaseInstanceId.getInstance().getToken();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Log.d("FCM_TEST", "当前令牌: " + fcmToken);

4. 适配Firebase SDK版本

如果你的Firebase SDK版本太新,可能和API 19不兼容。建议降级到经过验证兼容API 19的版本,比如在APP的build.gradle中修改:

implementation 'com.google.firebase:firebase-messaging:20.3.0'

这个版本我之前在API 19设备上测试过是正常的,你可以根据需求调整,但尽量避免用最新的SDK版本。

5. 排查网络限制

API 19设备连接的网络可能有防火墙或者代理限制,阻止了FCM和服务器的通信。你可以切换到移动数据或者其他无限制的网络,再测试令牌刷新是否正常。

额外优化建议

完善你的MyFirebaseInstanceIDService代码,记得调用父类的onTokenRefresh方法,同时增加详细日志方便排查:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 
    private static final String TAG = "MyFirebaseIIDService"; 

    @Override 
    public void onTokenRefresh() { 
        super.onTokenRefresh(); // 必须调用父类方法
        // 获取更新后的InstanceID令牌
        String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
        Log.d(TAG, "刷新后的FCM令牌: " + refreshedToken);
        // 这里添加将令牌上传到你的服务器的逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:50:42