0

我試圖檢索Firebase標記,但是當我第一次運行應用程序時,firebase標記爲null。我不知道爲什麼。當我第二次運行應用程序時,我得到了令牌。我看到另一篇文章有​​類似的問題,但我不明白。當我第一次運行應用程序時,Firebase標記爲空

這是我的代碼:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 
private static final String LOGTAG = "android-fcm"; 

@Override 
public void onTokenRefresh() { 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

    storeTokenInPref(refreshedToken); 

} 


private void storeTokenInPref(String token) { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putString("regId", token); 
    editor.apply(); 
} 

我有一個片段,你可以得到優惠的令牌,然後我想比較,如果令牌是在數據庫中。

public class Profile extends Fragment implements MainActivity.OnBackPressedListener{ 

private View view; 

private SharedPreferences preferences; 

private String token; 

private static final String LOGTAG = "android-fcm"; 

public Profile(){} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.profile, container, false); 

    ((MainActivity) getActivity()).setOnBackPressedListener(this); 

    preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 

    displayFirebaseToken(); 
    return view; 
} 

private void displayFirebaseToken() { 

    token = preferences.getString("regId", null); 
    Log.e(LOGTAG, "Firebase reg id: " + token); 

    if (!TextUtils.isEmpty(token)) { 

     SQLiteHelper database = new SQLiteHelper(getActivity(), "DB", null, 1); 

     List<Beacon> beaconList = database.getAllBeacons(); 

     String classroom = ""; 

     for (int i = 0; i < beaconList.size(); i++) { 

      if (beaconList.get(i).getId().equals(token)) { 
       classroom = beaconList.get(i).getClassroom(); 
       break; 
      } 
     } 
     classroomTextView.setText(classroom); 

    }else { 
     System.out.println("Firebase token is not received yet!"); 
    } 
} 
+0

調用'getToken()'時可能會收到空標記(請參閱[docs](https://firebase.google.com/docs/cloud-messaging/android/client#retrieve-the-current-registration -token))。 因此,第一次運行應用程序時,該令牌很可能仍在生成。在你的文章中,你已經實現了'onTokenRefresh()'。你可以驗證在調用'getToken()'一段時間之後它是否被調用嗎?如果是這樣,那麼這應該只是預期的行爲。 –

回答

0

這是因爲onTokenRefresh()和storeTokenInPref()沒有被您試圖在displayFirebaseToken使用的值的時候(還叫)。您需要等待使用令牌直到它可用。一般來說,沒有硬性規定需要多長時間,因爲它取決於網絡連接等因素。

0

嘗試這個

private void displayFirebaseToken() { 

token = preferences.getString("regId", null); 
if(token==null) 
token = FirebaseInstanceId.getInstance().getToken(); 
Log.e(LOGTAG, "Firebase reg id: " + token); 

if (!TextUtils.isEmpty(token)) { 

    SQLiteHelper database = new SQLiteHelper(getActivity(), "DB", null, 1); 

    List<Beacon> beaconList = database.getAllBeacons(); 

    String classroom = ""; 

    for (int i = 0; i < beaconList.size(); i++) { 

     if (beaconList.get(i).getId().equals(token)) { 
      classroom = beaconList.get(i).getClassroom(); 
      break; 
     } 
    } 
    classroomTextView.setText(classroom); 

}else { 
    System.out.println("Firebase token is not received yet!"); 
} 

既然你試圖讓保存的方法onTokenRefresh(設備令牌),這不叫,直到令牌將使用手動`

FirebaseInstanceId.getInstance().getToken(); 
被刷新,你需要得到它通過使用此代碼段

,你可以讓你的設備令牌任何地方在你的應用程序

`

相關問題