Android应用通过FCM获取推送通知但不显示消息

时间:2016-08-02 16:59:13

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

我通过FCM实施了推送通知。 当应用从我的服务器获取新通知时, 我在NotificationCompat.Builder中设置的图标注意到通知面板条,但是消息未预览为弹出窗口。 我试图设置优先级,样式,类别,但仍然没有显示通知。 当我滚动时,我可以看到通知。

我在两个不同的设备OS(6.0.1& 5.0.1)上尝试了该应用程序 另外我的后端C#解决方案 - 两个approches都没有弹出通知 - 消息和通知

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.theApp"
android:versionCode="31"
android:versionName="0.3.4"  >
<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="23" />
   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission    android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >


    <activity
        android:name="com.theApp.SplashScreen"
        android:screenOrientation="portrait"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>



    <activity
        android:name="com.theApp.MainView"
        android:windowSoftInputMode="adjustResize"
     android:screenOrientation="portrait"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo.NoActionBar" >
    </activity>


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

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


</application>




</manifest>

FirebaseMessagingService

package com.theApp;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
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"));
}
public void showNotification(String message)
{
    Intent i =new Intent(this,MainView.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP ); //FLAG_ACTIVITY_CLEAR_TOP

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

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setDefaults(Notification.DEFAULT_ALL)
            .setSmallIcon(R.drawable.ic_launcher)
            .setAutoCancel(true)
            .setContentTitle("Title")
            .setStyle(new NotificationCompat.BigTextStyle()
            .bigText(message))
            .setContentText(message)
            .setTicker(message)
            .setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setContentIntent(pendingIntent)
            .setCategory(NotificationCompat.CATEGORY_PROMO);

        NotificationManager manager =   (NotificationManager)getApplicationContext().getSystemService(Context.NOTI      FICATION_SERVICE);
        manager.notify(0,builder.build());

   }
}

后端(C#):

// Data message
  var contentData = new
            {
                registration_ids = tokens,
                priority = "high",
                data = new
                {                       
                    title = "this is title",
                    body = "this is body"
                }
            };

            // Notification message
            var contentData = new
            {
                registration_ids = tokens,
                priority = "high",
                notification = new
                {
                    title = title,
                    body = message
                }
            };

2 个答案:

答案 0 :(得分:0)

如果您想阅读通知,则必须致电remoteMessage.getNotification()而不是致电remoteMessage.getData()。请注意,'notification'密钥应该在您的服务器发送的有效负载中可用,以便将其解析为通知。 getData()仅返回Map如果您的服务器发送数据内容。有关详细信息,请参阅FCM guide

答案 1 :(得分:0)

我知道这是一个比较老的问题,但是要回答这个问题,您需要更改JSON有效负载,以便在设备上进行不同的处理。

请参阅This Question,以了解为什么它对要发送的有效负载有所不同。

简短的答案是,如果将其作为推送通知正文发送到Android设备:

{
  "data":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "firebase_long_token_goes_here"
}

您将能够在onMessageReceived()方法中对其进行解析,并根据解析JSON的方式决定是否显示来显示它。如果您以传统的方式或IOS解析方式发送它:

{
  "notification":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}

该应用程序处于后台,您将别无选择,并且无论您希望隐藏还是不显示它,系统都将显示它。