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

Android无google-services插件初始化Firebase后,程序化获取FCM Token方法

手动初始化Firebase后获取FCM Token的方法

嘿,刚好我之前也遇到过不用google-services插件手动初始化Firebase的场景,获取FCM Token的流程和常规情况大同小异,只是要注意几个细节,我给你一步步讲清楚:

1. 确保添加FCM依赖

首先得在你的app/build.gradle里添加Firebase Messaging的依赖(建议用官方最新版本):

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

2. 获取FCM Token的两种方式

方式一:主动调用获取(适合初始化时一次性获取)

注意:这个操作必须在后台线程执行,因为getToken()是异步任务,直接在主线程调用会导致ANR(应用无响应)。

new Thread(() -> {
    try {
        // 如果是默认初始化的FirebaseApp,直接用getInstance()即可
        String fcmToken = FirebaseMessaging.getInstance().getToken().getResult();
        // 拿到Token后,记得上传到你的服务器保存,方便后续给用户推送消息
        Log.d("FCM_DEBUG", "获取到的Token: " + fcmToken);
    } catch (Exception e) {
        e.printStackTrace();
        // 处理获取失败的情况,比如网络问题、Firebase配置参数错误
    }
}).start();

方式二:监听Token更新(更推荐,覆盖Token刷新场景)

FCM Token可能会在多种场景下刷新(比如应用重装、用户清除数据、设备系统更新等),所以通过监听的方式能及时获取到新的Token:

第一步:自定义FirebaseMessagingService

创建一个继承自FirebaseMessagingService的类,重写onNewToken方法:

public class MyFCMService extends FirebaseMessagingService {

    @Override
    public void onNewToken(@NonNull String token) {
        super.onNewToken(token);
        // 每当Token生成或刷新时,这个方法都会被调用
        Log.d("FCM_DEBUG", "新的Token已生成: " + token);
        // 把新Token上传到你的服务器
        uploadTokenToServer(token);
    }

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        // 可选:处理前台收到的推送消息,比如弹出通知
        handlePushMessage(remoteMessage);
    }

    // 实现上传Token到服务器的逻辑
    private void uploadTokenToServer(String token) {
        // 这里写你的网络请求代码,把Token发送到后端保存
    }

    // 处理推送消息的逻辑(可选)
    private void handlePushMessage(RemoteMessage remoteMessage) {
        // 提取消息内容,创建通知显示
        String title = remoteMessage.getNotification().getTitle();
        String body = remoteMessage.getNotification().getBody();
        // 这里写显示通知的代码
    }
}

第二步:在Manifest中注册服务

把刚才的自定义服务注册到AndroidManifest.xml里,让系统能识别到:

<service
    android:name=".MyFCMService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

3. 关键注意事项

  • 确认Firebase配置正确:你手动初始化时的FirebaseOptions参数(尤其是api-key、project-id)必须和Firebase控制台里的项目信息完全一致,否则会导致Token获取失败。
  • Android 13+权限申请:如果你的应用适配Android 13及以上版本,需要动态申请POST_NOTIFICATIONS权限,否则推送通知无法正常显示:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
        ActivityResultLauncher<String> permissionLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestPermission(),
                isGranted -> {
                    if (isGranted) {
                        // 权限已授予,可正常接收推送
                    }
                }
        );
        permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
    }
}
  • 多FirebaseApp场景:如果你手动初始化了多个FirebaseApp实例,获取Token时需要指定对应的App:
FirebaseApp customApp = FirebaseApp.getInstance("your-custom-app-name");
String token = FirebaseMessaging.getInstance(customApp).getToken().getResult();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:33:20