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(); 
被刷新,你需要得到它通过使用此代码段

,你可以让你的设备令牌任何地方在你的应用程序

`

相关问题