我正在跟踪this在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
表格
MainActivity
因此,这里我的应用程序已连接到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);
}
}
但是仍然不会生成相同的令牌
答案 0 :(得分:8)
仅在生成新令牌时调用onTokenRefresh
/ onNewToken
方法。
通常(尤其是在开发过程中),您的应用在添加服务之前已经已经生成了实例ID令牌。因此,不会调用onTokenRefresh
/ onNewToken
,并且共享首选项中也不会包含令牌。
因此,您应该使用FirebaseInstanceId.getInstance().getInstanceId()
直接从主要活动中获取令牌,如documentation所示。这将获取最后生成的令牌。从那里开始,您使用onTokenRefresh
/ onNewToken
响应令牌更改。
答案 1 :(得分:5)
只需将其添加到您的代码中即可。
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令牌一次,因此 忽略一旦使用共享的Prefs保存数据后保存数据或运行此活动/服务 < / strong>
答案 2 :(得分:2)
生成令牌可能需要一些时间。如果没有得到,可以按以下方式生成它: (参考: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
}
});
答案 3 :(得分:1)
尝试一下 只需卸载并重新安装应用 因为令牌不是在您每次玩应用程序时生成的。 它是在您清除sharePref或重新安装时生成的。
答案 4 :(得分:1)
不需要使用getToken()
由onNewToken
参数返回的新令牌
@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(); is also deprecated
在您的活动中获取令牌:.getToken();如果您也弃用了 需要在您的活动中获取令牌,然后使用以下方法:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});