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);
}
}
しかし、まだ同じトークンは生成されません
これをコードに追加するだけです。
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回呼び出されるため、データの保存または共有設定でデータが保存されたらこのアクティビティ/サービスの実行を無視
onTokenRefresh
/onNewToken
メソッドは、新しいトークンが生成されたときにのみ呼び出されます。
多くの場合(特に開発中)、アプリはサービスを追加する前に既にインスタンスIDトークンを生成しています。したがって、onTokenRefresh
/onNewToken
は呼び出されず、共有設定にトークンはありません。
このため、 documentation に示すように、FirebaseInstanceId.getInstance().getInstanceId()
を使用してメインアクティビティから直接トークンを取得する必要があります。これにより、最後に生成されたトークンが取得されます。そこから、onTokenRefresh
/onNewToken
を使用して、トークンchangesに応答します。
トークンの生成には時間がかかる場合があります。取得できない場合は、次のように生成できます:(参照: 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
}
});
アプリをプレイするたびにトークンが生成されるわけではないため、アプリをアンインストールして再インストールするだけです。 sharePrefをクリアするか再インストールすると生成されます。
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();アクティビティでトークンを取得する必要がある場合は非推奨になり、次のように使用します。
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});