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!