Android 当我第一次运行应用程序时,Firebase令牌为空

Android 当我第一次运行应用程序时,Firebase令牌为空,android,firebase,firebase-cloud-messaging,android-sharedpreferences,Android,Firebase,Firebase Cloud Messaging,Android Sharedpreferences,我正在尝试检索firebase令牌,但当我第一次运行应用程序时,firebase令牌为空。我不知道为什么。当我第二次运行应用程序时,我得到了令牌。我看到另一个帖子有类似的问题,但我不明白 这是我的代码: public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String LOGTAG = "android-fcm"; @Override public v

我正在尝试检索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!");
    }
}
公共类概要文件扩展片段实现MainActivity.OnBackPressedListener{
私人视野;
私人共享参考偏好;
私有字符串令牌;
私有静态最终字符串LOGTAG=“android fcm”;
公共配置文件(){}
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(右布局剖面,容器,假);
((MainActivity)getActivity()).setOnBackPressedListener(此);
preferences=PreferenceManager.GetDefaultSharedReferences(getContext());
displayFirebaseToken();
返回视图;
}
私有void displayFirebaseToken(){
token=preferences.getString(“regId”,null);
Log.e(LOGTAG,“Firebase注册id:”+令牌);
如果(!TextUtils.isEmpty(令牌)){
SQLiteHelper数据库=新的SQLiteHelper(getActivity(),“DB”,null,1);
List beaconList=database.getAllBeacons();
字符串=”;
对于(int i=0;i
发生这种情况是因为在您尝试使用displayFirebaseToken()中的值时,onTokenRefresh()和storeTokenInPref()尚未被调用。您需要等待使用令牌,直到它可用。一般来说,没有硬性规定需要多长时间,因为这取决于网络连接等因素。

试试这个

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!");
}
通过使用这段代码,您可以在应用程序中的任何位置获取设备令牌


`

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