【问题标题】:Cant receive Notifications from FCM while the app is in Foreground state应用处于前台状态时无法接收来自 FCM 的通知
【发布时间】:2019-04-13 16:38:41
【问题描述】:

我是 Android 和编程的新手,我正在创建一个从 FCM 接收消息的应用程序,它在后台运行时正常工作,所以我添加了一个 FirebaseMessagingService 类,它在 onMessageReceived 方法中接收通知并跟随谷歌docs,但在应用程序处于前台状态时通知仍然不起作用,我已按照每一步操作,无法弄清楚我的代码中的问题在哪里,因为日志对我没有帮助,而且我没有收到任何错误预期这个我不知道它是否是问题的根源: 在 GCM 事件 java.lang.NumberFormatException 中解析时间戳时出错:s == null

这是我的 MyFirebaseMessagingService 类

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;

import com.app.muhammadgamal.swapy.R;
import com.google.firebase.messaging.RemoteMessage;

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

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        String click_Action = remoteMessage.getNotification().getClickAction();


        String messageTitle = remoteMessage.getNotification().getTitle();
        String messageBody = remoteMessage.getNotification().getBody();


        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, getString(R.string.default_notification_channel_id))
                .setSmallIcon(R.drawable.ic_main_logo)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);


        Intent intent = new Intent(click_Action);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pendingIntent);


        int mNotificationID = (int)System.currentTimeMillis();
        NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.notify(mNotificationID,mBuilder.build());

    }
}

和我的清单文件

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.muhammadgamal.swapy">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_main_logo"
        android:label="@string/app_name"
        android:roundIcon="@drawable/ic_main_logo"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".Activities.SignInActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Activities.SignUpActivity"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".Activities.ProfileActivity"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".Activities.NavDrawerActivity"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".Activities.SwapCreationActivity"
            android:theme="@style/AppTheme.NoActionBar" />

        <activity android:name=".Activities.ReceivedSwapRequest">
            <intent-filter>
                <action android:name="com.app.muhammadgamal.swapy.Activities.ReceivedSwapRequest_NOTIFICATION_TASK"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

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

    </application>

</manifest>

和我的索引函数

   'use strict'


const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);


exports.sendNotification = functions.database.ref('/Notifications/{receiver_user_id}/{notification_id}')
.onWrite((data, context) =>
{
    const receiver_user_id = context.params.receiver_user_id;
    const notification_id = context.params.notification_id;


    console.log('We have a notification to send to :' , receiver_user_id);


    if (!data.after.val()) 
    {
        console.log('A notification has been deleted :' , notification_id);
        return null;
    }

    const DeviceToken = admin.database().ref(`/Users/${receiver_user_id}/device_token`).once('value');

    return DeviceToken.then(result => 
    {
        const token_id = result.val();

        const payload = 
        {
            notification:
            {
                title: "New Swap Request",
                body: `you have a new Swap Request, Please Check.`,
                click_action: "com.app.muhammadgamal.swapy.Activities.ReceivedSwapRequest_NOTIFICATION_TASK"
            }
        };

        return admin.messaging().sendToDevice(token_id, payload)
        .then(response => 
            {
                return console.log('This was a notification feature.');
            });
    });
});

【问题讨论】:

    标签: java android node.js firebase firebase-cloud-messaging


    【解决方案1】:

    我发现了问题,我使用的是 Android O 并且没有为通知设置频道 ID,如果你想在 Android 8.0 或更高版本上接收它,这是必须的

    所以这里是解决方案代码

     private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    

    【讨论】:

    • 您在哪里包含了解决问题的上述代码?谢谢
    • MyFirebaseMessagingService 类内部负责接收通知的类
    猜你喜欢
    • 2017-11-29
    • 2017-12-09
    • 2022-01-01
    • 2023-03-26
    • 2020-01-17
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多