FCM android onmessagereceived没有被调用

时间:2017-12-25 18:40:14

标签: android firebase push-notification firebase-cloud-messaging

我已在应用中实施了FCM。其他firebase功能正常工作,即上传到firebase存储和firebase实时消息传递。但是当我第一次向设备发送推送通知时,它会显示已成功发送的通知,但是在收到的消息未被调用时。然后当我发送另一个推送通知时,它显示未注册。然后它总是没有注册。

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d("myLog", "From: " + remoteMessage.getFrom());
    Log.d("myLog", "Notification Message Body: " + remoteMessage.getNotification().getBody());
}
}

app.gradle:

apply plugin: 'com.google.gms.google-services'

project.gralde:

classpath 'com.google.gms:google-services:3.1.0'

清单:

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

正确刷新设备令牌,当我清除数据并重新打开应用程序时,它会立即打印新的设备令牌。

3 个答案:

答案 0 :(得分:0)

您使用什么设备进行测试?众所周知,像小米和力科这样的制造商会阻止应用接收FCM通知。

对于像三星,摩托罗拉这样的设备:确保您正在处理正确类型的消息类型。您可以发送两种类型的FCM消息。

  1. 通知消息
  2. 数据讯息
  3. 阅读此页面以获取更多信息。

    https://firebase.google.com/docs/cloud-messaging/concept-options

答案 1 :(得分:0)

取决于来自控制台的消息类型的类型。 如果只有通知消息,那么如果您的应用已关闭,那么您的接收器将不会被解雇。 如果它带有通知消息数据消息,那么当应用处于前台时,您的应用仍然可以处理此消息

确保您使用此依赖关系compile 'com.google.firebase:firebase-messaging:10.2.1'

答案 2 :(得分:0)

根据以下情况调用

onMessageReceived(RemoteMessage remoteMessage)方法。

  • FCM响应,带有通知数据块:

{ “ ”:“设备令牌列表”, “ 通知”:{ “正文”:“您的通知的正文”, “ title”:“通知标题” }, “ 数据”:{ “ body”:“您的数据通知主体”, “ title”:“标题中的通知标题”, “ key_1”:“ key_1的值”, “ image_url”:“ www.abc.com/xyz.jpeg”, “ key_2”:“ key_2的值” } }

  1. 前景中的应用
调用

onMessageReceived(RemoteMessage remoteMessage),在通知栏中显示LargeIcon和BigPicture。我们可以从通知数据

中读取内容
  1. 后台应用:

onMessageReceived(RemoteMessage remoteMessage)未调用,系统托盘将接收消息并从 notification 块读取正文和标题,并在通知栏中显示默认消息和标题。

  • FCM响应,仅包含数据块:

在这种情况下,请从json中删除 notofocation

{ “ ”:“设备令牌列表”, “ 数据”:{ “ body”:“您的数据通知主体”, “ title”:“标题中的通知标题”, “ key_1”:“ key_1的值”, “ image_url”:“ www.abc.com/xyz.jpeg”, “ key_2”:“ key_2的值” } }

  1. 前景中的应用
调用

onMessageReceived(RemoteMessage remoteMessage),在通知栏中显示LargeIcon和BigPicture。我们可以从通知数据

中读取内容
  1. 后台应用:

onMessageReceived(RemoteMessage remoteMessage)被调用,由于响应中没有 notification 键,系统任务栏将不会接收到该消息。在通知栏中显示LargeIcon和BigPicture

代码

 private void sendNotification(Bitmap bitmap,  String title, String 
    message, PendingIntent resultPendingIntent) {

    NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
    style.bigPicture(bitmap);

    Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = mContext.getString(R.string.default_notification_channel_id);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "channel_name", NotificationManager.IMPORTANCE_HIGH);

        notificationManager.createNotificationChannel(notificationChannel);
    }
    Bitmap iconLarge = BitmapFactory.decodeResource(mContext.getResources(),
            R.drawable.mdmlogo);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.mdmlogo)
            .setContentTitle(title)
            .setAutoCancel(true)
            .setSound(defaultSound)
            .setContentText(message)
            .setContentIntent(resultPendingIntent)
            .setStyle(style)
            .setLargeIcon(iconLarge)
            .setWhen(System.currentTimeMillis())
            .setPriority(Notification.PRIORITY_MAX)
            .setChannelId(NOTIFICATION_CHANNEL_ID);


    notificationManager.notify(1, notificationBuilder.build());


}

参考链接:

https://firebase.google.com/docs/cloud-messaging/android/receive