Java 如何在 Android 中保存 FCM 令牌?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/51834864/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to Save a FCM token in Android?
提问by Don't Be negative
I am following thisto register my deivce in Firebase
我正在按照此在 Firebase 中注册我的设备
Here I am trying to display and save the notification token
在这里,我试图显示和保存通知令牌
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);
}
}
When I try to register it Always Says Token Token not generated
form
MainActivity
当我尝试注册它时,总是说 TokenToken not generated
表单
MainActivity
So Here My Application is connected to Firebase.. and I know that FirebaseInstanceIdService
is Deprecated I also tried with this
所以这里我的应用程序已连接到 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);
}
}
But Still same token is not generated
但仍然没有生成相同的令牌
采纳答案by Whats Going On
Just add this in your code..
只需在您的代码中添加这个..
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 Tokens are called once when the app is installed and runned for the first time so ignore the Saving the data or running this Activity/Service once the Data is Saved with Shared Prefs
Firebase 令牌在应用程序第一次安装和运行时调用一次,因此在使用共享首选项保存数据后忽略保存数据或运行此活动/服务
回答by Frank van Puffelen
The onTokenRefresh
/onNewToken
method will only be called when a new token is generated.
的onTokenRefresh
/onNewToken
生成新的令牌时方法将只被调用。
Quite often (especially during development) your app will already have generated an Instance ID token before you added the service. So onTokenRefresh
/onNewToken
will not be called, and you won't have a token in your shared preferences.
很多时候(尤其是在开发过程中)您的应用程序在您添加服务之前已经生成了一个实例 ID 令牌。所以onTokenRefresh
/onNewToken
不会被调用,并且您的共享首选项中不会有令牌。
For this reason you should get the token directly from your main activity with FirebaseInstanceId.getInstance().getInstanceId()
as shown in the documentation. This will pick up the token that was last generated. From there on you use onTokenRefresh
/onNewToken
to respond to token changes.
出于这个原因,您应该直接从您的主要活动中获取令牌,FirebaseInstanceId.getInstance().getInstanceId()
如文档中所示。这将获取上次生成的令牌。从那时起,您使用onTokenRefresh
/onNewToken
来响应令牌更改。
回答by Vishnu Magar
Try this just uninstall and reinstall app because token is not generated everytime you play the app. It's generated when you clear sharePref or reinstall.
试试这个只是卸载并重新安装应用程序,因为每次玩应用程序时都不会生成令牌。它是在您清除 sharePref 或重新安装时生成的。
回答by Khaled Lela
No need to Use getToken()
new token already returned by onNewToken
argument
无需使用参数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
Get Token in your Activity : .getToken(); is also deprecated if you need to get token in your activity then use as following:
在您的活动中获取令牌:.getToken(); 如果您需要在您的活动中获取令牌,则也不推荐使用,然后使用如下:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});
回答by shashank J
May be it takes some time to generate token. If you don't get it you can generate it as follow: (Reference:https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0)
可能需要一些时间来生成令牌。如果你没有得到它,你可以按如下方式生成它:(参考: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
}
});