web-dev-qa-db-fra.com

Comment enregistrer un jeton FCM dans Android?

Je suis this pour enregistrer mon appareil dans Firebase

Ici, j'essaie d'afficher et d'enregistrer le jeton de notification

    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);
    }
}

Lorsque j'essaie de l'enregistrer, dit toujours le jeton Token not generated forme MainActivity

Donc, ici, mon application est connectée à Firebase .. et je sais que FirebaseInstanceIdService est obsolète, j'ai également essayé avec ceci

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);
    }
}

Mais toujours le même jeton n'est pas généré

6
Don't Be negative

Ajoutez simplement ceci dans votre 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();
                    }

                }
            });
        }

    }


}

Les jetons Firebase sont appelés une fois lorsque l'application est installée et exécutée pour la première fois, donc ignorez l'enregistrement des données ou l'exécution de cette activité/service une fois que les données sont enregistrées avec des préférences partagées

6
Whats Going On

La méthode onTokenRefresh/onNewToken ne sera appelée que lorsqu'un nouveau jeton est généré.

Très souvent (en particulier pendant le développement), votre application a déjà généré un jeton ID d'instance avant d'ajouter le service. Ainsi, onTokenRefresh/onNewToken ne sera pas appelé et vous n'aurez pas de jeton dans vos préférences partagées.

Pour cette raison, vous devez obtenir le jeton directement de votre activité principale avec FirebaseInstanceId.getInstance().getInstanceId() comme indiqué dans documentation . Cela récupérera le dernier jeton généré. À partir de là, vous utilisez onTokenRefresh/onNewToken pour répondre aux modifications du jeton .

14
Frank van Puffelen

Peut-être qu'il faut un certain temps pour générer un jeton. Si vous ne l'obtenez pas, vous pouvez le générer comme suit: (Référence: https://firebase.google.com/docs/cloud-messaging/Android/client?authuser= )

 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

                        }
 });
2
shashank J

Essayez cela, désinstallez et réinstallez l'application car le jeton n'est pas généré à chaque fois que vous jouez l'application. Il est généré lorsque vous effacez sharePref ou réinstallez.

1
Vishnu Magar

Pas besoin d'utiliser getToken() nouveau jeton déjà retourné par l'argument 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 (); est également déconseillé

Obtenez un jeton dans votre activité: .getToken (); est également déconseillé si vous devez obtenir un jeton dans votre activité, puis utilisez comme suit:

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

     }
 });
1
Khaled Lela