Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Save a FCM token in Android?

I am following this to register my deivce in 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

So Here My Application is connected to Firebase.. and I know that FirebaseInstanceIdService is Deprecated I also tried with this

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

like image 736
Don't Be negative Avatar asked Aug 14 '18 06:08

Don't Be negative


3 Answers

The onTokenRefresh/onNewToken method will only be called when a new token is generated.

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.

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.

like image 92
Frank van Puffelen Avatar answered Oct 17 '22 00:10

Frank van Puffelen


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

like image 9
Whats Going On Avatar answered Oct 17 '22 02:10

Whats Going On


No need to Use getToken() new token already returned by onNewToken argument

@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:

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

     }
 });
like image 2
Khaled Lela Avatar answered Oct 17 '22 02:10

Khaled Lela