【问题标题】:Firebase token is null when I run the app for the first time当我第一次运行应用程序时,Firebase 令牌为空
【发布时间】:2017-04-23 17:31:37
【问题描述】:

我正在尝试检索 firebase 令牌,但当我第一次运行应用程序时,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!");
    }
}

【问题讨论】:

  • 调用getToken()(见docs)时可能会收到一个空令牌。因此,很有可能在您第一次运行应用程序时仍在生成令牌。在您的帖子中,您已经实现了onTokenRefresh()。您能否验证是否在调用getToken() 一段时间后调用它?如果是这样,那么这应该只是预期的行为。

标签: android firebase firebase-cloud-messaging android-sharedpreferences


【解决方案1】:

发生这种情况是因为在您尝试使用 displayFirebaseToken() 中的值时尚未调用 onTokenRefresh() 和 storeTokenInPref()。您需要等待使用令牌,直到它可用。一般来说,这需要多长时间并没有硬性规定,因为这取决于网络连接等因素。

【讨论】:

    【解决方案2】:

    试试这个

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

    通过使用这个 sn-p 代码,您可以在应用中的任何位置获取设备令牌

    `

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多