java FCM:没有调用 onMessageReceived,即使将 msg 发送到 fcm 也没有收到通知?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37639463/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 02:40:04  来源:igfitidea点击:

FCM : onMessageReceived is not called,notification didn't came even after sending msg to fcm?

javaandroidpush-notificationfirebase-cloud-messaging

提问by Tejasv Kulshrestha

i am developing an app where i want to implement FCM push notifications through php.

我正在开发一个应用程序,我想通过 php 实现 FCM 推送通知。

So i made two java files: 1.FirebaseInstanceID (Working fine and getting token properly in database) 2.FirebaseMessagingSerivice (Not Called)

所以我制作了两个 java 文件:1.FirebaseInstanceID(工作正常并在数据库中正确获取令牌)2.FirebaseMessagingSerivice(未调用)

My FirebaseMessagingService.java

我的 FirebaseMessagingService.java

package com.example.xyz;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import com.google.firebase.messaging.RemoteMessage;

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService{

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    showNotification(remoteMessage.getData().get("message"));
}

private void showNotification(String message) {

    Intent i = new Intent(this,Dashboard.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setContentTitle("FCM Test")
            .setContentText(message)
            .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
            .setContentIntent(pendingIntent);

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    manager.notify(0,builder.build());
}
}

My result when i run my php script to send message to FCM:

当我运行我的 php 脚本向 FCM 发送消息时的结果:

 {\"multicast_id\":7077449602201888040,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:1465110073498648%d215149df9fd7ecd\"}]}

But still i don't get any notification and all the configurations like api key,package name (in fcm console,my project) are checked and they are fine.

但是我仍然没有收到任何通知,并且检查了所有配置,例如 api 密钥、包名称(在 fcm 控制台中,我的项目)并且它们都很好。

When i debug the app by creating breakpoint at onMessageReceived() in FirebaseMessagingService.java, it doesn't go through that and app runs normally when message is pushed through php script to fcm server.

当我通过在 FirebaseMessagingService.java 中的 onMessageReceived() 处创建断点来调试应用程序时,当消息通过 php 脚本推送到 fcm 服务器时,它不会通过该断点并且应用程序正常运行。

My Dashboard.java

我的仪表盘.java

public class Dashboard extends AppCompatActivity {

private Toolbar toolbar;
private DrawerLayout drawer_layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dashboard);

    toolbar=(Toolbar) findViewById(R.id.app_bar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    drawer_layout=(DrawerLayout) findViewById(R.id.drawer_layout);
    NavigationDrawerFragment drawerfragment= (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
    drawerfragment.setUp(R.id.fragment_navigation_drawer,drawer_layout,toolbar);


    FirebaseMessaging.getInstance().subscribeToTopic("test");
    FirebaseInstanceId.getInstance().getToken();

}

But My dashboard activity contains a fragment over it.I don't that whether it may be a problem.

但是我的仪表板活动包含一个片段。我不知道它是否可能有问题。

AndroidManifest.xml

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.noticeboard"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
    android:name=".Dashboard"
    android:label="@string/title_activity_dashboard" >
</activity>
<activity
    android:name=".SplashScreen"
    android:label="@string/title_activity_splash_screen" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".Login"
    android:label="@string/title_activity_login" >
</activity>
<activity
    android:name=".NoticeViewer"
    android:label="@string/title_activity_notice_viewer" >
</activity>
<service
    android:name=".FirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGE_EVENT"/>
    </intent-filter>
</service>
<service
    android:name=".FirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>
</application>
</manifest>

LOGCAT

逻辑猫

06-05 12:06:05.678 32386-32386/com.example.noticeboard W/ActivityThread: Application com.example.noticeboard is waiting for the debugger on port 8100...
06-05 12:06:05.686 32386-32386/com.example.noticeboard I/System.out: Sending WAIT chunk
06-05 12:06:05.892 32386-32393/com.example.noticeboard I/art: Debugger is active
06-05 12:06:05.897 32386-32386/com.example.noticeboard I/System.out: Debugger has connected
06-05 12:06:05.897 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:06.107 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:06.317 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:06.527 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:06.587 32386-32393/com.example.noticeboard W/art: Suspending all threads took: 41.152ms
06-05 12:06:06.741 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:06.947 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:07.157 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:07.368 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:07.577 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:07.786 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:07.998 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle... 
06-05 12:06:08.208 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:08.418 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle...
06-05 12:06:08.628 32386-32386/com.example.noticeboard I/System.out: waiting for debugger to settle... 
06-05 12:06:08.838 32386-32386/com.example.noticeboard I/System.out: debugger has settled (1466)
06-05 12:06:08.884 32386-32386/com.example.noticeboard W/System: ClassLoader referenced unknown path: /data/app/com.example.noticeboard-1/lib/x86
06-05 12:06:08.906 32386-32386/com.example.noticeboard D/FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
06-05 12:06:08.918 32386-32386/com.example.noticeboard D/FirebaseApp: Initialized class com.google.firebase.iid.FirebaseInstanceId.
06-05 12:06:08.919 32386-32386/com.example.noticeboard D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
06-05 12:06:08.943 32386-32386/com.example.noticeboard I/FA: App measurement is starting up, version: 9080
06-05 12:06:08.943 32386-32386/com.example.noticeboard I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
06-05 12:06:09.022 32386-32386/com.example.noticeboard D/FirebaseApp: Initialized class com.google.android.gms.measurement.AppMeasurement.
06-05 12:06:09.022 32386-32386/com.example.noticeboard I/FirebaseInitProvider: FirebaseApp initialization successful
06-05 12:06:09.045 32386-32456/com.example.noticeboard W/GooglePlayServicesUtil: Google Play services out of date.  Requires 9080000 but found 8087470
06-05 12:06:09.130 32386-32457/com.example.noticeboard D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true

06-05 12:06:09.134 32386:32386 D/         ]
                                                                     HostConnection::get() New Host Connection established 0xabe6ce00, tid 32386
06-05 12:06:09.141 32386-32386/com.example.noticeboard W/FA: Service connection failed: ConnectionResult{statusCode=SERVICE_VERSION_UPDATE_REQUIRED, resolution=null, message=null}

[ 06-05    12:06:09.188 32386:32457 D/         ]
                                                         HostConnection::get() New Host Connection established 0xabe6cff0, tid 32457
06-05 12:06:09.193 32386-32457/com.example.noticeboard I/OpenGLRenderer: Initialized EGL, version 1.4
06-05 12:06:09.215 32386-32457/com.example.noticeboard W/EGL_emulation: eglSurfaceAttrib not implemented
06-05 12:06:09.215 32386-32457/com.example.noticeboard W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa3e6ca80, error=EGL_SUCCESS
06-05 12:06:17.473 32386-32394/com.example.noticeboard W/art: Method processed more than once: void java.lang.Thread.run()
06-05 12:06:17.474 32386-32395/com.example.noticeboard W/art: Method processed more than once: void java.lang.Object.wait(long)
06-05 12:06:17.474 32386-32395/com.example.noticeboard W/art: Method processed more than once: void java.lang.Thread.run()
06-05 12:06:17.478 32386-32396/com.example.noticeboard W/art: Method processed more than once: void java.lang.Thread.run()
06-05 12:06:32.514 32386-32457/com.example.noticeboard W/EGL_emulation: eglSurfaceAttrib not implemented
06-05 12:06:32.514 32386-32457/com.example.noticeboard W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa24ff280, error=EGL_SUCCESS
06-05 12:06:32.624 32386-32457/com.example.noticeboard E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabee3340
06-05 12:06:32.656 32386-332/com.example.noticeboard D/FirebaseInstanceId: topic sync succeeded

Thanks in Advance!

提前致谢!

回答by Yogesh Rathi

You are not following the proper code. Check this link again.

您没有遵循正确的代码。再次检查此链接

Solution

解决方案

Use below code

使用下面的代码

<action android:name="com.google.firebase.MESSAGING_EVENT" />

instead of

代替

<action android:name="com.google.firebase.MESSAGE_EVENT"/>

回答by Folusho Oladipo

Unfortunately, Usman Iqbal's answer is not completely correct. The official Android docs use MESSAGING_EVENT:

不幸的是,Usman Iqbal的回答并不完全正确。Android 官方文档使用 MESSAGING_EVENT:

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

Source: https://firebase.google.com/docs/cloud-messaging/android/receive#edit-the-app-manifest

来源:https: //firebase.google.com/docs/cloud-messaging/android/receive#edit-the-app-manifest

回答by Usman lqbal

Common mistake

常见的错误

android:name="YourApplicationPackageName.YourFirebaseMessagingServiceName"

You need to change some portion AndroidManifest.xml.

您需要更改某些部分AndroidManifest.xml

Your code:

你的代码

 <service
        android:name=".FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGE_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name=".FirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

Replace with following code:

替换为以下代码:

<service
            android:name="com.example.noticeboard.FirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGE_EVENT"/>
            </intent-filter>
        </service>
        <service
            android:name="com.example.noticeboard.FirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>