如何处理FirebaseInstanceId.getInstance()。getToken()= null

时间:2016-05-30 04:57:33

标签: android firebase firebase-cloud-messaging

我刚迁移到FCM。我已经添加了从FirebaseInstanceIdService扩展的类,以便在适当的时候接收refreshedToken。

我的问题是针对用户第一次安装我的应用程序并且由于某种原因无法从onTokenRefresh接收注册ID的情况。我们该如何应对呢?我可以从我的FirebaseInstanceIdService类设置一个广播接收器,它会在收到注册ID时通知Main活动吗?

6 个答案:

答案 0 :(得分:18)

  • 如果您的设备没有连接到互联网 onTokenRefresh()从未被调用,您应该通知用户他/她的设备没有互联网连接
  • firebase有自己的网络更改侦听器,当连接到互联网的设备尝试获取令牌并将其返回时,此时您可以通过发送本地广播接收器来接收注册令牌来告知您的主要活动。

使用以下代码:

    @Override
public void onTokenRefresh() {

    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();

    Log.d("FCN TOKEN GET", "Refreshed token: " + refreshedToken);

    final Intent intent = new Intent("tokenReceiver");
    // You can also include some extra data.
    final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
    intent.putExtra("token",refreshedToken);
    broadcastManager.sendBroadcast(intent);


}

在您的主要活动中:

    public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
   LocalBroadcastManager.getInstance(this).registerReceiver(tokenReceiver,
            new IntentFilter("tokenReceiver"));

}

BroadcastReceiver tokenReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String token = intent.getStringExtra("token");
        if(token != null)
        {
            //send token to your server or what you want to do
        }

    }
};

}

答案 1 :(得分:7)

在manifest.xml文件中更改此设置 工具:节点="替换" 至 工具:节点="合并"

答案 2 :(得分:6)

据我所知,只有当您尝试在没有Google Play服务的模拟器上运行您的应用以及您在Google Play商店中使用双重电子邮件ID时(在您的实际设备上),令牌才会为空,但只验证了一个电子邮件ID用于使用情况。这些是给你空令牌的情况,我已经在我的新项目中实现了FCM。因此,对于其他任何情况,令牌都不会为空。

答案 3 :(得分:1)

根据您的应用程序逻辑,您可以编写代码来处理" new"直接在FirebaseInstanceIdService.onTokenRefresh()方法中使用令牌,或者如果您需要在发生此事件时更改UI,则可以使用LocalBroadcast将此信息发送到您的活动。

请注意,调用onTokenRefresh()时,您的活动可能会被关闭。

可能的实施可以混合使用两个选项:

  1. onTokenRefresh()中添加一些逻辑以将令牌发送到您的服务器
  2. 使用LocalBroadcastReceiver通知您的活动,如果您有一个需要在令牌可用时更改的UI。

答案 4 :(得分:1)

使用此类扩展为..

public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";
    public static final String REGISTRATION_SUCCESS = "RegistrationSuccess";


    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        Toast.makeText(MyFirebaseInstanceIDService.this,refreshedToken,Toast.LENGTH_LONG).show();
    }
}

答案 5 :(得分:0)

如果您在模拟器上运行它,请检查您是否在工具中启用了Google Play服务 - > Android - > SDK Manager - > SDK工具 - > Google Play服务

安装完成后,重启Android Studio和模拟器​​

它对我有用