我尝试从GCM迁移到FCM。我读了这个guide。我从firebase quikstart app克隆代码一切都很好。但是,如果我尝试在我的应用程序中实现,我有一个问题。
我尝试从firebase控制台发送几条消息,状态其中一些“已完成”,但我的应用程序中没有收到任何内容...排除我一直收到的前几条消息:未注册的注册令牌。为了发送我使用来自FirebaseInstanceId.getInstance()的令牌.getToken()
我不明白这是问题。
我的InstanceIdService:
public class MyInstanceIDListenerService
extends FirebaseInstanceIdService {
@Inject
FCMTokenProvider FCMTokenProvider;
@Override
public void onCreate() {
super.onCreate();
MyApplication application = (MyApplication)getApplication();
application.getComponent().inject(this);
}
@Override
public void onTokenRefresh() {
String newToken = FirebaseInstanceId.getInstance().getToken();
FCMTokenProvider.initialize(getApplicationContext());
}
}
我的FirebaseMessagingService:
@EService
public class FcmMessageListenerService
extends FirebaseMessagingService {
@Inject
MessageDispatcher messageDispatcher;
@Override
public void onCreate() {
super.onCreate();
MyApplication application = (MyApplication)getApplication();
application.getComponent().inject(this);
}
@Override
public void onMessageReceived(RemoteMessage message){
MyApplication application = (MyApplication)getApplication();
if(application == null)
return;
if (message == null)
return;
String from = message.getFrom();
Map<String, String> stringData = message.getData();
Bundle data = new Bundle();
for(String key: stringData.keySet()){
data.putString(key, stringData.get(key));
}
messageDispatcher.handleMessage(from, data,application.getCurrentActivity());
}
}
我的清单的一部分:
<application>
...
<service
android:name=".infrastructure.fcm.services.FcmMessageListenerService_">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".infrastructure.fcm.services.MyInstanceIDListenerService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
...
</application>
我的build.gradle的一部分:
def GcmVersion = '10.2.1'
...
compile "com.google.android.gms:play-services-base:$GcmVersion"
compile "com.google.android.gms:play-services-identity:$GcmVersion"
compile "com.google.android.gms:play-services-maps:$GcmVersion"
compile "com.google.android.gms:play-services-location:$GcmVersion"
compile "com.google.android.gms:play-services-wallet:$GcmVersion"
compile "com.google.android.gms:play-services-ads:$GcmVersion"
compile "com.google.android.gms:play-services-auth:$GcmVersion"
compile "com.google.android.gms:play-services-cast-framework:$GcmVersion"
compile "com.google.android.gms:play-services-vision:$GcmVersion"
compile "com.google.android.gms:play-services-places:$GcmVersion"
compile "com.google.firebase:firebase-core:$GcmVersion"
compile "com.google.firebase:firebase-appindexing:$GcmVersion"
compile "com.google.firebase:firebase-messaging:$GcmVersion"
...
apply plugin: 'com.google.gms.google-services'
旧版Dagger 2和Firebase出现了一个问题。我刚刚将Dagger 2的版本更新为2.9
我将不胜感激任何帮助。
更新
我重命名并更新了GCMTokenProvider:
@Singleton
public class FCMTokenProvider {
private static final String TAG = "FCMTokenProvider";
private String fcmToken;
@Inject
public FCMTokenProvider(){
}
public void initialize(Context applicationContext){
this.fcmToken = FirebaseInstanceId.getInstance().getToken();
if(!Strings.isNullOrEmpty(fcmToken)){
EventBus.getDefault().post(new FcmToken(fcmToken));
}
Log.d(TAG, "run: fcm token: "+ fcmToken);
}
public String getFcmToken() {
return fcmToken;
}
}
每次应用程序启动时都会调用initialize()。
答案 0 :(得分:0)
我发现了自己的错误。 一开始我打电话给
时收到了错误FirebaseInstanceId.getInstance().getToken():
java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process it.clipcall.another. Make sure to call FirebaseApp.initializeApp(Context) first.
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
我通过添加onCreate Application exetended class
来修复它FirebaseApp.initializeApp(Context);
这是一个很大的错误!
我收到了一个令牌,但是当我在控制台中发送第一条消息时,我的状态为“已完成”,但在应用程序中没有收到任何消息。发送以下消息时,令牌未注册。我无法理解这是怎么回事。
现在我已经从我的应用程序中删除了所有库,现在我没有收到错误“java.lang.IllegalStateException:默认FirebaseApp未在...中初始化”我的应用程序正常工作,直到我开始添加库。 我发现支持版本和firebase lib版本之间存在不兼容性。
现在我用
gradle -q app:dependencies --configuration compile
用于查找隐藏支持依赖项并排除模块或组支持。