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
相关产品推荐
相关产品推荐

