如何在Android中保存FCM令牌?

我跟着这个在Firebase注册我的deivce

在这里,我试图显示并保存通知令牌

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIIDService"; @Override public void onTokenRefresh() { String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); storeToken(refreshedToken); } private void storeToken(String token) { //saving the token on shared preferences SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token); } } 

当我尝试注册时,总是说Token Token not generated从MainActivity Token not generated

所以我的应用程序已连接到Firebase ..我知道FirebaseInstanceIdService已弃用我也试过这个

 public class MyFirebaseInstanceIDService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseIIDService"; @Override public void onNewToken(String refreshedToken) { refreshedToken = FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); storeToken(refreshedToken); } private void storeToken(String token) { //saving the token on shared preferences SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token); } } 

但仍然没有生成相同的标记

只需在代码中添加它即可。

  public class MyActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); SharedPreferences prefs = getSharedPreferences("TOKEN_PREF", MODE_PRIVATE); String token = prefs.getString("token", ""); Log.e("NEW_INACTIVITY_TOKEN", token); if (TextUtils.isEmpty(token)) { FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MyActivity.this, new OnSuccessListener() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken", newToken); SharedPreferences.Editor editor = getSharedPreferences("TOKEN_PREF", MODE_PRIVATE).edit(); if (token!=null){ editor.putString("token", newToken); editor.apply(); } } }); } } } 

首次安装和运行应用程序时,将调用Firebase标记一次,因此在使用共享Prefs保存数据后 ,请忽略保存数据或运行此活动/服务

只有在生成新令牌时才会调用onTokenRefresh / onNewToken方法。

通常(特别是在开发期间)您的应用程序在添加服务之前已经生成了实例ID令牌。 因此,不会调用onTokenRefresh / onNewToken ,并且您的共享首选项中不会有令牌。

因此,您应该使用FirebaseInstanceId.getInstance().getInstanceId()直接从主活动中获取令牌,如文档中所示。 这将获取上次生成的令牌。 从那里开始,您使用onTokenRefresh / onNewToken来响应令牌更改

试试这只是卸载并重新安装应用程序,因为每次玩这个应用程序时都不会生成令牌。 它是在您清除sharePref或重新安装时生成的。

无需使用onNewToken参数已返回的onNewToken getToken() 新标记

 @Override public void onNewToken(String refreshedToken) { // No need to assign refreshedToken with getToken, // this method called when token refreshed then use returned refreshedToken directly, // use `instanceIdResult.getToken()` described below when you need to use token later throw app usage. // refreshedToken = FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); storeToken(refreshedToken); } 

为gettoken(); 也已弃用

在您的活动中获取令牌:.getToken(); 如果您需要在活动中获取令牌,则也不推荐使用,然后使用如下:

 FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken",newToken); } }); 

可能需要一些时间来生成令牌。 如果你没有得到它,你可以按照以下方式生成它:(参考: https : //firebase.google.com/docs/cloud-messaging/android/client?authuser = 0 )

  FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get new Instance ID token String token = task.getResult().getToken(); //Here you will surely get the token so store it in //sharedpreference for future use } });