Migrating GCM to FirebaseCM: onMessageReceived() not called in foreground

余生颓废 提交于 2019-12-11 04:37:03

问题


I'm trying to migrate Android client app from Google Cloud Messaging to Firebase Cloud Messaging. I strictly followed an official tutorial, but didn't succeed - onMessageReceived() method is not called when app in foreground.

So here are code snippets that I touched.

build.gradle (project level)

dependencies {
    //other stuff
    classpath 'com.google.gms:google-services:3.0.0'
}

build.gradle (app level)

apply plugin: 'com.google.gms.google-services' //this line in the bottom

and

dependencies {
    //other stuff here
    compile 'com.google.firebase:firebase-messaging:9.0.0'
}

AndroidManifest.xml

<service android:name=".service.FirebaseService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

and

<service
  android:name=".service.MyInstanceIDListenerService"
  android:exported="false">
   <intent-filter>
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
   </intent-filter>
</service>

and

<service
     android:name=".service.RegistrationIntentService"
     android:exported="false" />

as childs of <application> tag.

MyInstanceIDListenerService.java

public class MyInstanceIDListenerService extends FirebaseInstanceIdService {

final String TAG = "Firebase instance id";

@Override
public void onTokenRefresh() {

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
    intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

FirebaseService.java

public class FirebaseService extends FirebaseMessagingService {


//OtherStuff

@Override
public void onMessageReceived(RemoteMessage message){
    String from = message.getFrom();
    Map data = message.getData();

    Log.d(TAG, "Message: " + from); //Never appears in logcat
    //other stuff
}
}

RegistrationIntentService

public class RegistrationIntentService extends IntentService {

private static final String TAG = "RegIntentService";

public RegistrationIntentService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    try {
        synchronized (TAG) {
            String token = FirebaseInstanceId.getInstance().getToken();
            Log.i(TAG, "GCM Registration Token: " + token);//This works fine
            //and shows this line - 12-19 17:59:33.295 3146-5386/ru.bpc.mobilebank.bpc I/RegIntentService: GCM Registration Token: *some_token*

            sendRegistrationToServer(token);
        }
    } catch (Exception e) {
        Log.d(TAG, "Failed to complete token refresh", e);
    }
}

private void sendRegistrationToServer(String token) {
    Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
    intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

Please, tell if i did something wrong and why registrations seems to be done properly, but the onMessageReceived() method is never called even if the app is in foreground. Thanks in advance.

P.S. By the way, is adding SHA-1 keys in Firebase console necessary? maybe this could cause the problem? But Firebase says this action is optional.


回答1:


if you are using FCM then you should replace this

 <service android:name=".service.GcmService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

to

 <service android:name=".service.FirebaseService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

your service not registered properly..



来源:https://stackoverflow.com/questions/41226897/migrating-gcm-to-firebasecm-onmessagereceived-not-called-in-foreground

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!