FCM: onMessageReceived не вызывается, уведомление не пришло даже после отправки сообщения в fcm?

Я разрабатываю приложение, в котором хочу реализовать push-уведомления FCM через php.

Итак, я сделал два java-файла: 1.FirebaseInstanceID (отлично работает и правильно получает токен в базе данных) 2.FirebaseMessagingServiceivice (не вызывается)

Мой 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());
}
}

Мой результат, когда я запускаю свой php-скрипт для отправки сообщения в FCM:

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

Но все же я не получаю никаких уведомлений, и все конфигурации, такие как ключ API, имя пакета (в консоли fcm, мой проект), проверяются, и они в порядке.

Когда я отлаживаю приложение, создавая точку останова в onMessageReceived() в FirebaseMessagingService.java, оно не проходит через это, и приложение работает нормально, когда сообщение передается через php-скрипт на сервер fcm.

Моя панель инструментов.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();

}

Но моя активность на панели инструментов содержит фрагмент над ним. Я не знаю, может ли это быть проблемой.

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>

ЛОГКАТ

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

Заранее спасибо!


person Tejasv Kulshrestha    schedule 05.06.2016    source источник
comment
вы отправляете на правильный токен? вы можете добавить код вашего манифеста.   -  person Shubhank    schedule 05.06.2016
comment
добавлено ... и да, я отправляю правильный токен, только тогда я получаю успех: 1 в результате с сервера fcm. проверьте это ..   -  person Tejasv Kulshrestha    schedule 05.06.2016
comment
Успех также будет, если вы отправите токен на другое устройство. пожалуйста, удалите приложение и переустановите его, чтобы получить новый токен и использовать его для отправки сообщения.   -  person Shubhank    schedule 05.06.2016
comment
Сделал это также ... и я на 100% уверен, что токен, который я отправляю на сервер fcm, такой же, как у устройства, на котором я хочу получить уведомление ... спасибо ..   -  person Tejasv Kulshrestha    schedule 05.06.2016
comment
точка останова может не сработать, поскольку служба работает в потоке сравнения. Не могли бы вы попробовать добавить журналы и проверить logcat также для целей отладки.   -  person Shubhank    schedule 05.06.2016
comment
добавлено..пожалуйста, проверьте..   -  person Tejasv Kulshrestha    schedule 05.06.2016
comment
можете ли вы поделиться своей серверной частью object, которую вы отправляете.? потому что я сталкиваюсь с той же проблемой.   -  person Usman lqbal    schedule 06.06.2016


Ответы (3)


Вы не следуете правильному коду. Проверьте эту ссылку еще раз.

Решение

Используйте приведенный ниже код

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

вместо

<action android:name="com.google.firebase.MESSAGE_EVENT"/>
person Yogesh Rathi    schedule 23.06.2016

Общая ошибка

android:name="YourApplicationPackageName.YourFirebaseMessagingServiceName"

Вам нужно изменить часть AndroidManifest.xml.

Ваш код:

 <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>

Замените следующим кодом:

<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>
person Usman lqbal    schedule 07.06.2016
comment
Недавно за несколько часов до того, как я решил проблему, проблема в файле манифеста. Я только что изменил com.google.firebase.MESSAGE_EVENT на com.google.firebase.MESSAGING_EVENT... это решило мою проблему... кстати, спасибо за ваши усилия! - person Tejasv Kulshrestha; 07.06.2016
comment
у меня был такой же, и выше упомянутое (ответ) работает для меня. - person Usman lqbal; 07.06.2016
comment
что ты изменил? - person Usman lqbal; 07.06.2016
comment
я только что упомянул в комментарии, что изменил com.google.firebase.MESSAGE_EVENT на com.google.firebase.MESSAGING_EVENT... и проблема решена! - person Tejasv Kulshrestha; 07.06.2016

К сожалению, ответ Усмана Икбала не совсем правильный. В официальных документах Android используется MESSAGING_EVENT:

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

Источник: https://firebase.google.com/docs/cloud-messaging/android/receive#edit-the-app-manifest

person Folusho Oladipo    schedule 28.10.2016