我正在按照这个在Firebase中注册我的设备。
在这里,我正在尝试显示并保存通知令牌
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 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);
}
}
但仍然没有生成相同的令牌
只有在生成新令牌时才会调用onTokenRefresh
/onNewToken
方法。
通常(尤其是在开发过程中(,在添加服务之前,应用已经生成了实例 ID 令牌。因此,不会调用onTokenRefresh
/onNewToken
,并且您的共享首选项中不会有令牌。
因此,您应该直接从主活动中获取令牌,FirebaseInstanceId.getInstance().getInstanceId()
如文档中所示。这将选取上次生成的令牌。从那里开始,您可以使用onTokenRefresh
/onNewToken
来响应令牌更改。
只需将其添加到您的代码中即可。
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<InstanceIdResult>() {
@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 令牌在首次安装和运行应用时调用一次,因此请忽略使用共享首选项保存数据后保存数据或运行此活动/服务
无需使用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<InstanceIdResult>() {
@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<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 token = task.getResult().getToken();
//Here you will surely get the token so store it in
//sharedpreference for future use
}
});
试试这个 只需卸载并重新安装应用程序 因为每次玩应用程序时都不会生成令牌。 它是在清除 sharePref 或重新安装时生成的。