web-dev-qa-db-ja.com

AndroidでFCMトークンを保存する方法は?

Firebaseにデバイスを登録するために this をフォローしています

ここでは、通知トークンを表示して保存しようとしています

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

しかし、まだ同じトークンは生成されません

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トークンは、アプリが初めてインストールおよび実行されるときに1回呼び出されるため、データの保存または共有設定でデータが保存されたらこのアクティビティ/サービスの実行を無視

6
Whats Going On

onTokenRefresh/onNewTokenメソッドは、新しいトークンが生成されたときにのみ呼び出されます。

多くの場合(特に開発中)、アプリはサービスを追加する前に既にインスタンスIDトークンを生成しています。したがって、onTokenRefresh/onNewTokenは呼び出されず、共有設定にトークンはありません。

このため、 documentation に示すように、FirebaseInstanceId.getInstance().getInstanceId()を使用してメインアクティビティから直接トークンを取得する必要があります。これにより、最後に生成されたトークンが取得されます。そこから、onTokenRefresh/onNewTokenを使用して、トークンchangesに応答します。

14

トークンの生成には時間がかかる場合があります。取得できない場合は、次のように生成できます:(参照: 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

アプリをプレイするたびにトークンが生成されるわけではないため、アプリをアンインストールして再インストールするだけです。 sharePrefをクリアするか再インストールすると生成されます。

1
Vishnu Magar

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();は非推奨

アクティビティでトークンを取得:.getToken();アクティビティでトークンを取得する必要がある場合は非推奨になり、次のように使用します。

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