2

I'm trying to implement notifications to my app using FCM and have been experiencing some problems. When the app is in the foreground there is no problems and the notification is shown as expected. However if the app is in the background the notification won't be shown.

My manifest looks like this:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-sdk android:minSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service
        android:name=".NotificationService">
        <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>

    <activity android:name=".MainActivity" android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />


    <meta-data
        android:name="io.fabric.ApiKey"
        android:value="xxx" />
     </application>
   </manifest>

And my service class:

 package pw.ckies.snakegame;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import java.util.Random;

public class NotificationService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        String title = "Empty";
        String message = "Emptyyy";
        if(remoteMessage.getNotification() != null) {
            if (remoteMessage.getNotification().getTitle() != null) {
                title = remoteMessage.getNotification().getTitle();
            }


            if (remoteMessage.getNotification().getBody() != null) {
                message = remoteMessage.getNotification().getBody();
            }
        }

        Log.e("notification","recieved");


        sendNotification(title, message);
    }

    private void sendNotification(String title, String message) {

        Intent intent = new Intent(this, MainActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_people_black_24dp)
                .setLargeIcon(BitmapFactory.decodeResource(this.getResources(),
                        R.mipmap.ic_launcher))
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(getRequestCode(), notificationBuilder.build());
    }

    private static int getRequestCode() {
        Random rnd = new Random();
        return 100 + rnd.nextInt(900000);
    }

}

Also when a notification is recieved logcat says:

07-01 23:09:14.050 ? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=xxx (has extras) }

I have no idea what it means so I googled it and found alot of people who had the same problem. Someone said that reinstalling Android Studio would solve the issue so I did that and updated to the latest version 2.3.3 without any luck. I have been testing on a OnePlus 3 on android 7.1.1.

My build.grade (App module):

 ...
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile "com.google.android.gms:play-services-games:${gms_library_version}"
        compile project(':BaseGameUtils')
        compile 'com.android.support:appcompat-v7:24.0.0'

        compile 'com.android.support:design:24.0.0'
        compile 'com.android.support:support-annotations:24.0.0'
        compile 'com.google.firebase:firebase-ads:11.0.1'
        compile 'com.google.firebase:firebase-core:11.0.1'
        compile 'com.google.firebase:firebase-messaging:11.0.1'
        compile('com.crashlytics.sdk.android:crashlytics:2.6.6@aar') {
            transitive = true;
        }
    }

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

My backend is a python post request using the following data:

{
    "notification": {"title": "Title goes here", "body": "Body goes here" },
    "to": token
}

I have also tried sending the notification from the firebase dashboard.

Someone also suggested an unsigned APK wouldn't allow background notifications which I'm not sure about? But as my app is on the Play Store that would not be any issue.

I have tested everything I can think but I can't find a solution! It might be my phone or maybe just a stupid mistake. Any help is appreciated!

2 Answers2

0

From the firebase docs

When in the background, apps receive the notification payload in the notification tray, and only handle the data payload when the user taps on the notification.

Someone also suggested an unsigned APK wouldn't allow background notifications which I'm not sure about? But as my app is on the Play Store that would not be any issue.

Your application is signed by default with default keystore. All depends on SHA1 added to your project settings in firebase console.

For production or debug keystore, you can generate SHA1 from here

I have tested everything I can think but I can't find a solution! Try sending the notification payload contain title and body (optional) data keys

  {
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }
Shubham AgaRwal
  • 4,355
  • 8
  • 41
  • 62
0

FirebaseMessagingService's "onMessageReceived()" method doesn't get called when your App is in background or closed. It happens when you are not sending any data in your notification. You need to send some values whatever you want with your notification through Data Payload from your server. After that it'll work in each and every situation even when app is closed or in background.

Note: To send data in notification you need your own server, Firebase doesn't facilitate with that.

Check this link for more details:

How to handle notification when app in background in Firebase

Zohaib Hassan
  • 984
  • 2
  • 7
  • 11
  • Sending data values doesn't make any difference. – Globala Dev Jul 01 '17 at 22:15
  • Please make sure your server is sending data payload properly, because the issue I told you is most frequent reason in the question described above. There must be something missing. Follow this tutorial precisely for both app and server. It works like charm. http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ – Zohaib Hassan Jul 01 '17 at 22:23