我刚刚迁移到 FCM。我已经添加了一个继承自 FirebaseInstanceIdService 的类,以在适当时接收刷新的令牌。
我的问题是针对用户第一次安装应用程序并由于某种原因无法从 onTokenRefresh 中接收到注册 ID 的情况。我们该如何处理这种情况?我能否从我的 FirebaseInstanceIdService 类中设置广播接收器,在接收到注册 ID 时通知主 Activity?
我刚刚迁移到 FCM。我已经添加了一个继承自 FirebaseInstanceIdService 的类,以在适当时接收刷新的令牌。
我的问题是针对用户第一次安装应用程序并由于某种原因无法从 onTokenRefresh 中接收到注册 ID 的情况。我们该如何处理这种情况?我能否从我的 FirebaseInstanceIdService 类中设置广播接收器,在接收到注册 ID 时通知主 Activity?
请使用以下代码:
@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
}
}
};
}
启动屏幕-> 如果(没有令牌){继续使用启动屏幕,直到获得令牌,然后将启动屏幕删除以进入主活动}
。任何帮助都将不胜感激。 - Wisd0m将manifest.xml文件中的 tools:node="replace" 替换为 tools:node="merge"。
onTokenRefresh
方法并获取更新的令牌;如果没有网络连接,则首先在应用中处理“互联网连接性”。 - Mrugeshpublic 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();
}
}
我曾经遇到过同样的问题。我查看了很多Stack Overflow帖子和其他论坛,最终找到了适合我的解决方案。FCM文档建议使用此方法获取令牌。
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);
FCM文档将第一种方法描述为:
返回默认Firebase项目的主令牌。
而第二种方法被描述为:
返回一个令牌,该令牌授权实体代表由Instance ID标识的应用程序执行操作。 这类似于OAuth2令牌,但它适用于应用程序实例而不是用户。 例如,要获取可用于通过FirebaseMessaging发送消息到应用程序的令牌,请设置为发送者ID,并将其设置为“FCM”。
我一直在研究为什么第一种方法调用需要更长时间才能返回令牌,但我还没有找到答案。希望这可以帮助您。
FirebaseInstanceIdService.onTokenRefresh()
方法中编写处理“new”标记的代码,或者如果需要在此事件发生时更改UI,则可以使用LocalBroadcast将此信息发送到您的活动。请注意,在调用onTokenRefresh()
时,您的活动可能已经关闭。一种可能的实现方法是两个选项的混合:
onTokenRefresh()
中添加一些逻辑以将令牌发送到您的服务器如果您在模拟器上运行它,请检查您是否在“工具” -> “Android” -> “SDK 管理器” -> “SDK 工具” -> “Google Play 服务”中启用了 Google Play 服务。
安装完成后,请重新启动 Android Studio 和模拟器
这对我起作用了