如何在Android中保存FCM令牌?

Don*_*ive 4 java android firebase firebase-cloud-messaging

我跟着这个在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试注册时,总是说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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*len 13

onTokenRefresh/ onNewToken生成新的令牌时方法将只被调用.

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

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


Wha*_* On 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();
                    }

                }
            });
        }

    }


}
Run Code Online (Sandbox Code Playgroud)

首次安装和运行该应用程序时,将调用一次Firebase令牌,因此,一旦使用共享的Prefs保存数据,就忽略保存数据或运行此活动/服务。