web-dev-qa-db-fra.com

Messagerie cloud Firebase - onMessageReceived ne fonctionne pas

Je veux créer une fonction de notification simple dans mon application. J'ai suivi cette vidéo YouTube et ces deux URL de documentation Firebase 1 et 2 plus l'assistant de l'outil Firebase dans Android Studio (qui dit que je suis connecté à Firebase). Pour une raison quelconque, en suivant ces étapes et ces documents sur mon ancienne application (dont le code est affiché ci-dessous), cela ne me permettra pas de recevoir des notifications. Cependant, si je suis les mêmes étapes sur une toute nouvelle application, cela fonctionne parfaitement. J'ai testé les deux applications sur le même appareil physique et le même environnement en arrière-plan, états actifs et terminés. Chaque fois que la nouvelle application de démonstration que j'ai créée fonctionne sans problème, mais mon ancienne application dans laquelle je veux des notifications ne fonctionne pas. Les deux ont été testés sans obtenir l'ID de l'appareil. Je n'ai même pas de journaux d'erreurs ni de journal TAG. Je pense que l'un de mes projets compilés interfère, je ne sais pas exactement quoi, mais je devrais peut-être y regarder.

J'ai également vérifié tous ces SO messages déjà: 12 et plus

PS. J'ai supprimé mon nom de package ci-dessous, j'ai vérifié plusieurs fois sur FireBase et ils correspondent donc je sais que ce n'est pas le problème. Cependant, la FireBase de ma nouvelle application de démonstration montre que mon application s'est connectée, mais pas la FireBase de mon ancienne application. En outre, j'ai défini une prime avant et rencontre toujours le même problème.

Voici mon code problématique:

Notification.Java (c'est un service comme le demande la documentation)

public class Notification extends FirebaseMessagingService {
public Notification() {
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    showNotification(remoteMessage.getData().get("message"));

    Log.d("FMC", "Message Notification Body: " + remoteMessage.getNotification().getBody());
}

private void showNotification(String message) {
    Intent i=new Intent(this, SplashScreen.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder builder=new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setContentTitle("FCM TITLE").setContentText(message)
            .setSmallIcon(R.drawable.pt_icon)
            .setDefaults(Android.app.Notification.DEFAULT_ALL)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(0,builder.build());
}
}

Remarquez que je ne reçois même pas de journal dans la notification.Java ci-dessus.

Project.gradle

buildscript {
repositories {
    jcenter()
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
}
dependencies {
    classpath 'com.Android.tools.build:gradle:3.0.1'
    classpath 'com.google.gms:google-services:3.2.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()

    maven { url "https://jitpack.io" }
    maven { url 'https://maven.google.com' }
    google()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

app.gradle

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 26

defaultConfig {

    minSdkVersion 16
    targetSdkVersion 26
    versionCode 16
    versionName "2.6"
}
dexOptions {
    jumboMode = true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}
//Code below is added to fix random error ("Fix the issues identified by lint")
lintOptions {
    abortOnError false
}
productFlavors {
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(path: ':backend', configuration: 'Android-endpoints')
//Removed the 0.2.+
compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0'
//noinspection GradleCompatible
compile 'com.Android.support:appcompat-v7:25.4.0'
compile "com.Android.support:appcompat-v7:19.0.+"
compile 'com.Android.support:design:23.4.0'
compile 'com.Android.support:recyclerview-v7:23.4.0'
compile 'com.Android.support:cardview-v7:23.4.0'

compile 'com.github.danylovolokh:video-player-manager:0.2.0'
compile 'com.github.danylovolokh:list-visibility-utils:0.2.0'



implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'


compile 'com.orhanobut:dialogplus:1.11@aar'


compile 'com.nineoldandroids:library:2.4.0'
compile files('libs/sinch-Android-rtc-3.9.14.jar')
compile 'com.amazonaws:aws-Android-sdk-s3:2.4.4'
compile 'com.github.chrisbanes:PhotoView:1.2.6'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'
compile 'com.github.amlcurran.showcaseview:library:5.4.3'
compile 'com.github.d-max:spots-dialog:0.7@aar'
compile 'com.victor:lib:1.0.4'
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.Android.support:recyclerview-v7:23.0.0'
compile 'me.grantland:autofittextview:0.2.0'
compile 'com.wang.avi:library:1.0.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.braintreepayments.api:drop-in:2.3.8'
compile 'com.braintreepayments.api:braintree:2.3.9'
compile 'com.loopj.Android:android-async-http:1.4.9'
compile 'com.getbase:floatingactionbutton:1.10.1'
compile 'com.mxn.soul:flowingdrawer-core:1.2.2'
compile 'com.github.rengwuxian:MaterialEditText:2.1.4'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'net.gotev:uploadservice:3.2.5'
compile 'in.srain.cube:ultra-ptr:1.0.11'
compile 'com.Android.support.constraint:constraint-layout:1.0.0-alpha9'
testCompile 'junit:junit:4.12'
//implementation 'com.Android.support:appcompat-v4:23.+'
}


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

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">

<uses-feature
    Android:name="Android.hardware.microphone"
    Android:required="false" />

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<!--
so the app can be found on tablets Google Play

<uses-permission Android:name="Android.permission.CALL_PHONE" />
-->
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE"/> -->
<!-- <uses-permission Android:name="Android.permission.WAKE_LOCK" /> -->
<!-- <uses-permission Android:name="Android.permission.READ_PHONE_STATE" /> -->

<grant-uri-permission
    Android:path="string"
    Android:pathPattern="string"
    Android:pathPrefix="string" />

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/_icon"
    Android:label=""
    Android:supportsRtl="true"
    Android:theme="@style/Theme.AppCompat.Light.NoActionBar"
    tools:node="replace">
    <activity Android:name=".SplashScreen">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

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

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

    <!-- &lt;!&ndash; -->
    <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
    <!-- See README() for more. -->
    <!-- &ndash;&gt; -->
    <!-- <meta-data -->
    <!-- Android:name="com.google.firebase.messaging.default_notification_icon" -->
    <!-- Android:resource="@drawable/pt_icon" /> -->
    <!-- &lt;!&ndash; -->
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming -->
    <!-- notification message. See README() for more. -->
    <!-- &ndash;&gt; -->
    <!-- <meta-data -->
    <!-- Android:name="com.google.firebase.messaging.default_notification_color" -->
    <!-- Android:resource="@color/colorAccent" /> -->

    <activity Android:name=".SignInForm" />
    <activity Android:name=".SignUpPage" />
    <activity Android:name=".SellerFillOutForm" />
    <activity Android:name=".BuyerFillOutForm" />
    <activity
        Android:name=".BuyerHomePage"
        Android:label="@string/title_activity_buyer_home_page" />

    <action Android:name="Android.intent.action.VIEW" />

    <category Android:name="Android.intent.category.BROWSABLE" />

    <data Android:scheme="http" />

    <activity Android:name=".VideoPlayerActivity" />
    <activity Android:name=".BackgroundTask" />

    <service
        Android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
        Android:enabled="true" />

    <activity Android:name=".EnterCreditCard" />
    <activity Android:name=".PickMeeting" />
    <activity Android:name=".HowBillingWorks" />
    <activity Android:name=".ReBillingPlan" />
    <activity Android:name=".PayBill" />
    <activity
        Android:name=".Buyer_Home_Page"
        Android:configChanges="locale|orientation" />
    <activity Android:name=".Seller_Home_Page" />
    <activity Android:name=".ProductList" />
    <activity Android:name=".EditProduct" />
    <activity Android:name=".EditSellerAccount" />
    <activity Android:name=".EditBuyerAccount" />
    <activity Android:name=".Video_Calling.incomingVideoCall" />
    <activity Android:name=".Video_Calling.CallScreenActivity" />
    <activity Android:name=".SellerAnalytics" />
    <activity Android:name=".Swipe_Layout.SwipeLayout" />
    <activity Android:name=".Swipe_Layout.PopUpActivity" />
</application>

</manifest>

Code de travail ci-dessous (l'application que j'ai créée juste pour tester mes étapes et fonctionne à 100%):

Notifaction.Java

import Android.app.Notification;
import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.app.Service;
import Android.content.Intent;
import Android.os.IBinder;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;

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

import static Android.content.ContentValues.TAG;

public class Notifaction extends FirebaseMessagingService {
public Notifaction() {
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    showNotification(remoteMessage.getData().get("message"));
}

private void showNotification(String message) {
    Intent i=new Intent(this,MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder builder=new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setContentTitle("FCM TITLE").setContentText(message)
            .setSmallIcon(R.drawable.ic_launcher_background)
            .setDefaults(Notification.DEFAULT_ALL)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(0,builder.build());
}
}

AndroidManiest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="">
<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:roundIcon="@mipmap/ic_launcher_round"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
    <activity Android:name=".MainActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

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

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

</application>

</manifest>

app.gradle

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 26
defaultConfig {
    applicationId ""
    minSdkVersion 14
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
implementation 'com.Android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.Android.support.test:runner:1.0.1'
androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.1'
}


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

Project.grdle

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.Android.tools.build:gradle:3.0.1'
    classpath 'com.google.gms:google-services:3.2.0'

    // NOTE: Do not place your application dependencies here; they 
belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    google()
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

J'ai également ajouté le fichier .json aux deux projets. Voici une capture d'écran: link .

13
Lazar Kukolj

Très probablement, vos notifications ne s'affichent pas en raison de Android Oreo nouveau modèle de notifications qui nécessite de spécifier des définitions de canaux afin de construire et de afficher les notifications. Toujours dans votre app.gradle, vous ciblez Android version 26 qui est Android Oreo , vous devrez donc implémenter le code ci-dessous dans les deux cas.

Il est facile à adopter. il vous suffit de:

1. définir un canal de notification dans votre YourApplicationClass.onCreate ()

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel chan1 = new NotificationChannel(
                YOUR_DESIRED_CHANNEL_ID_STRING,
                YOUR_DESIRED_CHANNEL_LABEL_STRING, 
                NotificationManager.IMPORTANCE_DEFAULT);

            chan1.setDescription(YOUR_DESIRED_CHANNEL_DESC_STRING);//OPTIONAL
            chan1.setLightColor(Color.BLUE);//OPTIONAL     
            chan1.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//OPTIONAL
            chan1.setShowBadge(true);//OPTIONAL

            getManager().createNotificationChannel(chan1);
        }

2. remplacez votre générateur de notifications par ce constructeur

    NotificationCompat.Builder builder=
new NotificationCompat.Builder(this, YOUR_DESIRED_CHANNEL_ID_STRING);

Bon à savoir que vous pouvez définir plusieurs chaînes avec des propriétés différentes ciblant Android Oreo et supérieur

5
Bassel Mourjan

Si vous recevez un jeton d'appareil et que vous avez une clé API de serveur, vérifiez que votre code fonctionne correctement ou n'utilise pas pushtry . cela donnera une erreur comme Enregistrement invalide , Erreur 404 etc. si vous avez fait une erreur dans votre code. et pour l'implémentation de FCM, vous pouvez suivre ce tutoriel- Tutoriel FCM

Une dernière chose que j'ai remarquée dans votre build.gradlefichier il n'y a pas de applicationId "Package Name" dans defaultConfig. Je ne suis pas sûr mais c'est le nom du package et utilisé lorsque nous créons un projet sur la console Firebase (Nom du projet avec le package)

5
aj0822ArpitJoshi

Si vous regardez ceci doc Vous ne semblez pas avoir un service qui étend FirebaseInstanceIdService pour gérer la création/rotation du jeton. Ici est un exemple de code. Le jeton dont vous avez besoin pour envoyer les notifications Push à un appareil spécifique est reçu par cette classe.

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

[~ # ~] éditez [~ # ~] :

D'accord, cette erreur me dérange maintenant. J'ai regardé votre arbre de dépendance et je vois que vous en répétez certains. Par exemple, vous avez trois versions de:

compile 'com.Android.support:appcompat-v7:25.4.0'

Vous devriez peut-être effacer cela vers la dernière version ou la faire correspondre avec la version de travail. Vous utilisez également le nouveau plugin gradle, mais vous n'avez pas mis à jour vos dépendances pour utiliser implementation au lieu de compile dans la plupart des cas, essayez peut-être aussi? Voici pourquoi vous devriez le faire.

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(path: ':backend', configuration: 'Android-endpoints')
//Removed the 0.2.+
compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0'
//noinspection GradleCompatible
compile 'com.Android.support:appcompat-v7:25.4.0'
compile "com.Android.support:appcompat-v7:19.0.+"
compile 'com.Android.support:design:23.4.0'
compile 'com.Android.support:recyclerview-v7:23.4.0'
compile 'com.Android.support:cardview-v7:23.4.0'

compile 'com.github.danylovolokh:video-player-manager:0.2.0'
compile 'com.github.danylovolokh:list-visibility-utils:0.2.0'



implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'


compile 'com.orhanobut:dialogplus:1.11@aar'


compile 'com.nineoldandroids:library:2.4.0'
compile files('libs/sinch-Android-rtc-3.9.14.jar')
compile 'com.amazonaws:aws-Android-sdk-s3:2.4.4'
compile 'com.github.chrisbanes:PhotoView:1.2.6'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'
compile 'com.github.amlcurran.showcaseview:library:5.4.3'
compile 'com.github.d-max:spots-dialog:0.7@aar'
compile 'com.victor:lib:1.0.4'
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.Android.support:recyclerview-v7:23.0.0'
compile 'me.grantland:autofittextview:0.2.0'
compile 'com.wang.avi:library:1.0.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.braintreepayments.api:drop-in:2.3.8'
compile 'com.braintreepayments.api:braintree:2.3.9'
compile 'com.loopj.Android:android-async-http:1.4.9'
compile 'com.getbase:floatingactionbutton:1.10.1'
compile 'com.mxn.soul:flowingdrawer-core:1.2.2'
compile 'com.github.rengwuxian:MaterialEditText:2.1.4'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'net.gotev:uploadservice:3.2.5'
compile 'in.srain.cube:ultra-ptr:1.0.11'
compile 'com.Android.support.constraint:constraint-layout:1.0.0-alpha9'
testCompile 'junit:junit:4.12'
//implementation 'com.Android.support:appcompat-v4:23.+'
}

Mettez également à jour vos dépendances et utilisez l'implémentation au lieu de compiler:

implementation 'com.google.firebase:firebase-messaging:15.0.2'
implementation 'com.google.firebase:firebase-core:15.0.2'
4
Levi Moreira

Supprimez la charge utile de notification de vos messages FCM afin que la charge utile de données soit livrée à la méthode onMessageReceived.

Lisez attentivement le lien ci-dessous.

Lorsque votre application est en arrière-plan, la charge utile de données est transmise à la méthode onMessageReceived uniquement s'il n'y a pas de charge utile de notification. (Marquez les mots)

Dans le cas où les deux charges utiles existent, le système gère automatiquement la partie de notification (barre d'état système) et votre application obtient la charge utile de données dans les extras de l'intention de l'activité du lanceur (après que l'utilisateur a tapé sur la notification).

Afin de pouvoir servir les deux plates-formes avec succès, Android et iOS, vous devrez peut-être envoyer des messages FCM différents selon le système d'exploitation du client.

3
tushar

// cette aide pour démarrer le service FCM en arrière-plan lors du redémarrage du téléphone.

Add receiver in Manifest.xml

<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<receiver Android:name=".OnBootBroadcastReceiver">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
</receiver>

OnBootBroadcastReceiver.class

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;

public class OnBootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent("com.examle.FirebaseMessagingReceiveService");
        i.setClass(context, FirebaseMessagingReceiveService.class);
        context.startService(i);
    }
}
3
jessica

J'espère que vous connaissez les types de notifications.Pour envoyer une notification, vous devez utiliser un serveur personnalisé ou quelque chose comme Postman.Pour plus d'informations, veuillez vous référer à la réponse de ces questions:

Comment gérer la notification lorsque l'application en arrière-plan dans Firebase

Quoi qu'il en soit, vous devez appeler la méthode handleIntent (Intent intention) dans votre FirebaseMessagingService afin d'appeler la méthode onMessageReceived ().

Voici mon code de travail complet, notification-when-app-in-background-in-firebase.

build.gradle:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 26
    buildToolsVersion '26.0.3'
    defaultConfig {
        applicationId "com.abc.xyz"
        minSdkVersion 17
        targetSdkVersion 26
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.Android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.Android.support:support-v4:26.1.0'
    implementation 'com.Android.support:appcompat-v7:26.1.0'
    implementation 'com.Android.support:design:26.1.0'
    implementation 'com.Android.support:recyclerview-v7:26.1.0'
    implementation 'com.Android.support:cardview-v7:26.1.0'
    //firebase analytics and ads
    implementation 'com.google.firebase:firebase-ads:11.4.2'
    implementation 'com.google.firebase:firebase-core:11.4.2'
    implementation 'com.google.firebase:firebase-messaging:11.4.2'
    implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
}

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

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.abc.xyz">

    <uses-permission Android:name="Android.permission.WAKE_LOCK" />
    <uses-permission Android:name="Android.permission.VIBRATE" />
    <uses-permission Android:name="Android.permission.INTERNET" />

    <application
        Android:name=".MyApplication"
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:roundIcon="@mipmap/ic_launcher_round"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme">
        <activity Android:name=".MainActivity">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

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


        <!-- [START fcm_default_icon] -->

        <meta-data
            Android:name="com.google.firebase.messaging.default_notification_icon"
            Android:resource="@drawable/ic_stat_ic_notification" />

        <meta-data
            Android:name="com.google.firebase.messaging.default_notification_color"
            Android:resource="@color/colorAccent" />
        <!-- [END fcm_default_icon] -->
        <!-- [START fcm_default_channel] -->
        <meta-data
            Android:name="com.google.firebase.messaging.default_notification_channel_id"
            Android:value="@string/default_notification_channel_id" />
        <!-- [END fcm_default_channel] -->

        <service
            Android:name=".services.MyFirebaseMessagingService"
            Android:enabled="true"
            Android:exported="true">
            <intent-filter>
                <action Android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <service Android:name=".services.MyFirebaseInstanceIDService">
            <intent-filter>
                <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        <service
            Android:name=".services.MyJobService"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.firebase.jobdispatcher.ACTION_EXECUTE" />
            </intent-filter>
        </service>

    </application>

</manifest>

MyFirebaseMessagingService.Java:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void handleIntent(Intent intent) {

        Log.e(TAG, "handleIntent");
        try
        {
            if (intent.getExtras() != null)
            {
                RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");

                for (String key : intent.getExtras().keySet())
                {
                    builder.addData(key, intent.getExtras().get(key).toString());
                }

                onMessageReceived(builder.build());
            }
            else
            {
                super.handleIntent(intent);
            }
        }
        catch (Exception e)
        {
            super.handleIntent(intent);
        }
    }

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // [START_EXCLUDE]
        // There are two types of messages data messages and notification messages. Data messages are handled
        // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
        // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
        // is in the foreground. When the app is in the background an automatically generated notification is displayed.
        // When the user taps on the notification they are returned to the app. Messages containing both notification
        // and data payloads are treated as notification messages. The Firebase console always sends notification
        // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
        // [END_EXCLUDE]

        // TODO(developer): Handle FCM messages here.
        // Not getting messages here? See why this may be:
        Log.e(TAG, "Notification received Successfully");
        Log.e(TAG, "From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.e(TAG, "Message data payload: " + remoteMessage.getData());

            if (/* Check if data needs to be processed by long running job */ true) {
                // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
                scheduleJob();
            } else {
                // Handle message within 10 seconds
                handleNow();
            }

        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.e(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
    }
    // [END receive_message]

    /**
     * Schedule a job using FirebaseJobDispatcher.
     */
    private void scheduleJob() {
        // [START dispatch_job]
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(MyJobService.class)
                .setTag("my-job-tag")
                .build();
        dispatcher.schedule(myJob);
        // [END dispatch_job]
    }

    /**
     * Handle time allotted to BroadcastReceivers.
     */
    private void handleNow() {
        Log.e(TAG, "Short lived task is done.");
    }

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param messageBody FCM message body received.
     */
    private void sendNotification(String messageBody) {
        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);

        String channelId = getString(R.string.default_notification_channel_id);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_ic_notification)
                        .setContentTitle("FCM Message")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

MyFirebaseInstanceIDService.Java:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    private static final String TAG = "MyFirebaseIIDService";

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        Log.e(TAG, "onTokenRefresh");
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.e(TAG, "Refreshed token: " + refreshedToken);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(refreshedToken);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     *
     * Modify this method to associate the user's FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // TODO: Implement this method to send token to your app server.
    }
}

MyJobService.Java

@RequiresApi(api = Build.VERSION_CODES.Lollipop)
public class MyJobService extends JobService {

    private static final String TAG = "MyJobService";

    @Override
    public boolean onStartJob(JobParameters job) {
        // Do some work here
        Log.e(TAG, "Inside MyJobService");
        return false; // Answers the question: "Is there still work going on?"
    }

    @Override
    public boolean onStopJob(JobParameters job) {
        Log.e(TAG, "Inside MyJobService");
        return false; // Answers the question: "Should this job be retried?"
    }
}

MyApplication.Java:

public class MyApplication extends MultiDexApplication {

    @Override
    public void onCreate() {
        super.onCreate();

        // active JobSchedulerReceiver
        Intent intent = new Intent();
        intent.setAction(getPackageName() + ".receiver.JobSchedulerReceiver");
        sendBroadcast(intent);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

MainActivity.Java:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.e(TAG, "Inside MainActivity");

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Create channel to show notifications.
            String channelId = getString(R.string.default_notification_channel_id);
            String channelName = getString(R.string.default_notification_channel_name);
            NotificationManager notificationManager =
                    getSystemService(NotificationManager.class);
            assert notificationManager != null;
            notificationManager.createNotificationChannel(new NotificationChannel(channelId,
                    channelName, NotificationManager.IMPORTANCE_LOW));
        }

        // If a notification message is tapped, any data accompanying the notification
        // message is available in the intent extras. In this sample the launcher
        // intent is fired when the notification is tapped, so any accompanying data would
        // be handled here. If you want a different intent fired, set the click_action
        // field of the notification message to the desired intent. The launcher intent
        // is used when no click_action is specified.
        //
        // Handle possible data accompanying notification message.
        // [START handle_data_extras]
        if (getIntent().getExtras() != null) {
            for (String key : getIntent().getExtras().keySet()) {
                Object value = getIntent().getExtras().get(key);
                Log.e(TAG, "Key: " + key + " Value: " + value);
            }
        }
        // [END handle_data_extras]

        Button subscribeButton = findViewById(R.id.subscribeButton);
        subscribeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // [START subscribe_topics]
                FirebaseMessaging.getInstance().subscribeToTopic("news");
                // [END subscribe_topics]

                // Log and toast
                String msg = getString(R.string.msg_subscribed);
                Log.e(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

        Button logTokenButton = findViewById(R.id.logTokenButton);
        logTokenButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Get token
                String token = FirebaseInstanceId.getInstance().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.e(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

    }
}
3
Milan Hirpara

Même moi, j'ai rencontré le même problème, il a été résolu en ajoutant le chemin complet Android: nom service dans AndroidManifest.xml

<service Android:name="com.testapp.Notifaction">
     <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

essayez une fois et faites-moi savoir si vous avez un problème.

3
Shanmugapriyan

Allons étape par étape, je vais vérifier tout votre code par rapport à mon projet actuel, qui est en production avec la dernière version du service de messagerie Firebase:

  • Vos dépendances sur gradle semblent bonnes, mais vous avez juste besoin de implementation "com.google.firebase:firebase-messaging:15.0.2"

  • Pourriez-vous essayer de renommer votre classe en quelque chose de différent? Notification nom peut-être son interaction avec la propre Android. Rappelez-vous également qu'elle devrait avoir un constructeur Empty (mais je vois dans votre code que vous l'avez)

Appelez-le MessagingController par exemple et placez-le sur votre manifeste à l'intérieur <application> comme:

   <!--Service to control messaging requests-->
        <service
            Android:name=".messaging.controller.MessagingController"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>

N'oubliez pas non plus que vous avez besoin d'une instance de FirebaseInstanceService, ceci est requis comme le document officiel dit :

Un service qui étend FirebaseInstanceIdService pour gérer la création, la rotation et la mise à jour des jetons d'enregistrement. Cela est nécessaire pour l'envoi vers des appareils spécifiques ou pour créer des groupes d'appareils.

<!--Firebase instance service to renew messaging tokens-->
        <service
            Android:name=".messaging.service.FirebaseInstanceService"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
  • Envoyez-vous les notifications à partir de la console Firebase? Ou à l'aide des fonctions de Firebase Cloud? Dans les deux cas, introduisez-vous le bon jeton? Si vous mettez une console Firebase à jeton expiré, une erreur s'affiche, vous devez ajouter la notification comme suit:

enter image description here

  • Ok, à ce stade, avec votre code, cela devrait au moins recevoir les notifications dans vos journaux,

  • Si vous le souhaitez, vous pouvez vérifier le prochain projet qui est une application Skeleton pour construire un système de notification. Peut-être que cela vous aidera aussi: https://github.com/FrangSierra/PushNotificationSkeleton

  • Enfin, si vous voulez vérifier un code de fonction cloud sur la façon d'envoyer des notifications depuis le serveur, je vous suggère de jeter un œil au Ce référentiel

Puisque vous n'avez reçu aucun événement de journal de Firebase, vérifiez les étapes suivantes:

  • Allez votre console de projet Firebase entrez les paramètres du projet et vérifiez si le nom du package est correct.
  • Téléchargez à nouveau le fichier JSON et copiez-le dans app/ module (changer la perspective du projet de Android en projet), S'ASSURER que le nom du fichier estgoogle-services.json
  • Exécutez votre projet, accédez à la recherche logcat du mot clé Firebase, en cas de succès, vous verrez un message:

I/FirebaseInitProvider: initialisation FirebaseApp réussie

2
Pavel Poley

Ce n'est qu'une simple suggestion, mais ce qui m'a causé une erreur similaire il y a quelques semaines, c'est que j'ai envoyé le mauvais formulaire de notification. J'ai envoyé des notifications silencieuses, même si j'aurais dû envoyer fort. Vérifiez comment votre serveur envoie des messages. J'ai également foiré l'ordre dans lequel l'API FCM attend les clés.

Voici mon code pour les notifications bruyantes qui sont envoyées par un serveur Django Python:

def _build_loud_message(not_id, data):
    """Construct loud notifiation message.
    Loud means that this message will show up in the notifications hub
    of the app.
    """
    return {
        'message': {
            'notification': {
                'title': 'New activity',
                'body': 'Hey you have some new activity!'
            },
            'data': {"data": data},
            'apns': {
                'payload': {
                    "notId": not_id,  # notId HAS TO BE FIRST!!!
                    'aps': {
                        'badge': 1,
                        'sound': 'default',
                        'content-available': 1
                    }
                },
                'headers': {
                    'apns-priority': '10',
                    'apns-collapse-id': 'myid-1'
                }
            },
            'Android': {
                'priority': "high",
                'data': {
                    "androidData": data
                },
                'notification': {
                    'sound': 'default',
                    'tag': 'mytag-1'
                }
            }
        }
    }

Faites également très attention à l'ordre dans lequel les clés DIC sont mentionnées. Les modifier peut empêcher l'envoi du message de FCM au périphérique, même si l'api FCM indique qu'il a bien été envoyé.

1
J. Hesters

il existe deux types de données de notification 1) charge utile de notification 2) charge utile de données si vous envoyez des données à partir du serveur en moyenne de charge utile de notification. il est possible de ne pas appeler onMessageRecieved () de FirbaseMessagingService jetez un oeil sur ce lien

1
Mohd Qasim

Laissez l'application écouter une certaine valeur dans la base de données Firebase et changez-la comme le message que vous souhaitez. Je fais cela pour mes applications et son fonctionnement comme un charme.

1
anas

Avez-vous enregistré votre application sur la console FCM? Et ajouté le fichier .json dans votre application?

1
Ashwini Atale