在Android中获取FCM消息令牌的正确方法是啥?
Posted
技术标签:
【中文标题】在Android中获取FCM消息令牌的正确方法是啥?【英文标题】:What is the correct way to get the messaging token for FCM in Android?在Android中获取FCM消息令牌的正确方法是什么? 【发布时间】:2020-10-28 00:23:08 【问题描述】:晚上好!
我希望将 Firebase 云消息传递添加到我的项目(android、Java)中。我已按照文档 https://firebase.google.com/docs/cloud-messaging/android/client#retrieve-the-current-registration-token 到发球台,但在检索消息令牌时仍然遇到问题。 Android Studio 声称 无法解析“FirebaseMessaging”中的方法“getToken”,因此无法编译。我假设我需要编写一个方法 getToken(),但找不到任何关于该方法应该做什么的文档。
这是我的课程,它按照文档描述扩展了 FirebaseMessagingService。
public class PushNotificationManager extends FirebaseMessagingService
public String MT;
public PushNotificationManager()
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>()
@Override
public void onComplete(@NonNull Task<String> task)
if (!task.isSuccessful())
System.out.println("Failed to get token");
return;
MT = task.getResult();
);
@Override
public void onNewToken(String token)
super.onNewToken(token);
MT = token;
System.out.println("Refreshed token: " + token);
根据文档,我还覆盖了 onNewToken(),但我从来没有打印到日志中。
这是我添加到清单中的服务:
<service android:name=".PushNotificationManager">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
有许多关于这个主题的旧堆栈溢出文章,但没有一个有效,大多数都超过一年,并且使用现在已弃用的 InstanceID()。
有什么建议吗?感谢您的宝贵时间!
更新
感谢我在下面与 Doug 的对话,我已经解决了我的问题。首先,我在这个类中关注 onNewToken(),并在构造函数中删除了我的 getToken() 请求。
public class PushNotificationManager extends FirebaseMessagingService
public String MT;
public PushNotificationManager()
@Override
public void onNewToken(String token)
super.onNewToken(token);
MT = token;
System.out.println("Refreshed token: " + token);
这与清单文件的更新相结合,会在应用启动时记录消息传递令牌完全重新安装后。现在,要将令牌存储在 Firebase RTB 中,我需要在初始化数据库后访问它。所以我在我的数据库类中添加了一个方法,在数据库初始化后调用。它看起来像这样:
private void setMT()
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>()
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task)
if (!task.isSuccessful())
//Log.w(TAG, "getInstanceId failed", task.getException());
return;
// Get new Instance ID token
String MT = (String) task.getResult().getToken();
System.out.println("Messaging token: "+MT);
//Now I can save it to the RTB
);
现在它开始工作了!谢谢你的帮助,道格!
【问题讨论】:
【参考方案1】:如果您在FirebaseMessagingService
的注册子类中覆盖onNewToken
,那么您不需要任何其他东西来获取令牌。您可以使用getToken
按需获取它,或者使用onNewToken
通过回调接收它。没有理由同时做这两件事(尤其是在同一个班级),除非你绝对知道你需要这样做。
如果您没有收到对 onNewToken 的回调,那么您可能没有完全 follow the instructions 并将您的 FirebaseMessagingService
子类添加为您的清单中的 Android 服务。
【讨论】:
谢谢 Doug,我确实用新服务更新了我的清单,并将用新服务更新我的问题,也许我有一个错误。 你仍然不应该在同一个课程中同时使用这两种技术。这似乎没有帮助。专注于其中一个。 谢谢!我删除了 getToken() 并且正在运行一个空的构造函数。现在,当我卸载并重新安装该应用程序时,我会收到带有消息传递令牌的日志。我现在的问题是这发生在我的任何其他代码之前,所以我无法在 onNewToken 方法中将其写入数据库,因为我的数据库尚未初始化。我想为这个用户将混乱令牌添加到我的 firebase 数据库中,以便我可以将它与云功能一起使用。我如何访问它?以上是关于在Android中获取FCM消息令牌的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Android Firebase 云消息传递令牌 (FCM) 令牌太短/不完整
在 FCM(Firebase 云消息传递)中,在通知中包含令牌是不是安全?