Kein Benachrichtigungston beim Senden einer Benachrichtigung von Firebase in Android

81

Ich sende eine Push-Benachrichtigung von Firebase an meine Android-Anwendung. Wenn sich meine App jedoch im Hintergrund befindet, wird die Methode fireMase onMessageReceived nicht aufgerufen. Stattdessen sendet firebase eine Benachrichtigung an das System, um die Benachrichtigung in der Taskleiste anzuzeigen. Die Benachrichtigung wird in der Taskleiste angezeigt, aber es ist kein Benachrichtigungston zu hören, auch wenn ich in den Systemeinstellungen den Benachrichtigungston für meine App zugelassen habe.

Was kann ich tun, um Benachrichtigungston abzuspielen, wenn eine Benachrichtigung von Firebase empfangen wird?

Auf diese Weise sende ich eine Benachrichtigung von Firebase an meinen Blogpost-Link .

So fügen Sie Firebase in Ihre Android-Anwendung ein

Entwickeln
quelle
1
Bitte beziehen Sie sich auf diese Antwort ..
Geekoraul
Hallo Leute, mein Problem wurde behoben. Lesen Sie diesen Beitrag für Details. Developine.com/…
Developine
Stellen Sie

Antworten:

113

In der Benachrichtigungsnutzlast der Benachrichtigung befindet sich ein Soundschlüssel.

Aus der offiziellen Dokumentation geht hervor, dass:

Zeigt einen Ton an, der abgespielt werden soll, wenn das Gerät eine Benachrichtigung erhält. Unterstützt die Standardeinstellung oder den Dateinamen einer in der App enthaltenen Soundressource. Audiodateien müssen sich in / res / raw / befinden.

Z.B:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "mySound"
    }
  }

Wenn Sie den Standardton des Geräts verwenden möchten, sollten Sie Folgendes verwenden : "sound": "default".

Unter diesem Link finden Sie alle möglichen Schlüssel in den Nutzdaten: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

Für diejenigen, die Firebase nicht kennen, werden Benachrichtigungen anders behandelt, wenn sich die App im Hintergrund befindet. In diesem Fall wird die Funktion onMessageReceived nicht aufgerufen.

Wenn sich Ihre App im Hintergrund befindet, leitet Android Benachrichtigungsnachrichten an die Taskleiste weiter. Ein Benutzer, der auf die Benachrichtigung tippt, öffnet standardmäßig den App-Starter. Dies schließt Nachrichten ein, die sowohl Benachrichtigungen als auch Datennutzdaten enthalten. In diesen Fällen wird die Benachrichtigung an die Taskleiste des Geräts gesendet, und die Datennutzlast wird in den Extras der Absicht Ihrer Starteraktivität geliefert.

Isj
quelle
23
Wenn Sie den Standard-Sound des Geräts verwenden möchten, sollten Sie Folgendes verwenden: "Sound": "Standard"
Brian Vo
@TranVo danke für die Hinweise, dass der "Standard" -Wert den Standard-Sound des Geräts wiedergibt. Sie haben mir viel Zeit gespart!
Mattia Ruggiero
1
Ich habe alle möglichen Möglichkeiten ausprobiert, konnte aber nicht den Standardklang oder
-ton
1
Wie kann ich den Ton der Benachrichtigung deaktivieren?
iamatsundere181
1
Hat das neue Notification Channel-System diese API für ältere Geräte überholt oder funktioniert es immer noch für ältere Geräte? Ich habe versucht, benutzerdefinierte Sounds für ein Nougat-Gerät anzuzeigen, aber ich scheine nur den Standard-Glockenspiel-Soundeffekt zu erhalten, unabhängig davon, was ich in "Sound" oder "SoundName" eingebe. Ich habe "mysoundeffect.wav" und "mysoundeffect" ohne Glück ausprobiert.
John Gorenfeld
26

Adavaced OptionenWählen Sie erweiterte Optionen, wenn Sie eine Nachricht schreiben , und wählen Sie Sound aktiviert Wählen Sie aktiviert

Das ist meine Lösung

KongJing
quelle
@KongJing in Android 8 und höher, es hat immer Sound unabhängig von der Einstellung der Firebase-Konsole. Kennen Sie einen Weg, um Geräusche vollständig zu verhindern?
Denken Sie zweimal Code einmal
Es tut mir leid, das so spät zu sehen, dass ich dieses Problem nicht lösen kann. @ Think Twice Code Once
KongJing
22

Versuche dies

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@note für benutzerdefinierten Benachrichtigungston: -> "sound" : "MyCustomeSound.wav"

Sameer
quelle
1
Wo legen Sie diese Datei ab? in roh? Vermögenswerte?
Hamzeh Soboh
3
Kein Assets-Ordner, erstellen Sie einen neuen Ordner unter res und nennen Sie ihn raw. Kopieren Sie dann Ihre WAV- oder MP3-Datei und fügen Sie sie in diesen Ordner ein. @ HamzehSoboh
Verbündeter Makongo
12

Die onMessageReceivedMethode wird nur ausgelöst, wenn sich die App im Vordergrund befindet oder die Benachrichtigungsnutzdaten nur den Datentyp enthalten.

Aus den Firebase-Dokumenten

Für Downstream-Messaging bietet FCM zwei Arten von Nutzdaten: Benachrichtigung und Daten .

Für den Benachrichtigungstyp zeigt FCM die Nachricht automatisch Endbenutzergeräten im Namen der Client-App an. Benachrichtigungen verfügen über einen vordefinierten Satz von vom Benutzer sichtbaren Schlüsseln.
Für den Datentyp ist die Client-App für die Verarbeitung von Datennachrichten verantwortlich. Datennachrichten haben nur benutzerdefinierte Schlüssel-Wert-Paare.

Verwenden Sie Benachrichtigungen, wenn FCM die Anzeige einer Benachrichtigung im Namen Ihrer Client-App übernehmen soll. Verwenden Sie Datennachrichten, wenn Ihre App die Anzeige übernehmen oder die Nachrichten in Ihrer Android-Client-App verarbeiten soll oder wenn Sie Nachrichten an iOS-Geräte senden möchten, wenn eine direkte FCM-Verbindung besteht.

Weiter unten in den Dokumenten

Das Verhalten der App beim Empfang von Nachrichten, die sowohl Benachrichtigungs- als auch Datennutzdaten enthalten, hängt davon ab, ob sich die App im Hintergrund oder im Vordergrund befindet - im Wesentlichen davon, ob sie zum Zeitpunkt des Empfangs aktiv ist oder nicht.
Im Hintergrund empfangen Apps die Benachrichtigungsnutzdaten in der Benachrichtigungsleiste und verarbeiten die Datennutzdaten nur, wenn der Benutzer auf die Benachrichtigung tippt.
Im Vordergrund empfängt Ihre App ein Nachrichtenobjekt mit beiden verfügbaren Nutzdaten.

Wenn Sie die Firebase-Konsole zum Senden von Benachrichtigungen verwenden, enthält die Nutzlast immer den Benachrichtigungstyp. Sie müssen die Firebase-API verwenden, um die Benachrichtigung nur mit dem Datentyp in der Benachrichtigungsnutzlast zu senden. Auf diese Weise wird Ihre App immer benachrichtigt, wenn eine neue Benachrichtigung eingeht, und die App kann die Benachrichtigungsnutzlast verarbeiten.

Wenn Sie den Benachrichtigungston mit der herkömmlichen Methode im Hintergrund abspielen möchten, müssen Sie den Soundparameter zur Benachrichtigungsnutzlast hinzufügen .

Renjith
quelle
Nein, es wird auch aufgerufen, wenn die App geschlossen ist, aber Sie sollten den automatischen Start der App zulassen.
Funky-nd
10

Bei der HTTP v1-API ist das anders

Dokumentation

Beispiel:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}
Andrew
quelle
Wie schreibe ich das in PHP?
Tabish Khan
@ Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz
5

Ich hatte auch ein Problem mit Benachrichtigungen, die Ton ausgeben mussten. Als die App im Vordergrund stand, funktionierte alles korrekt, aber als die App im Hintergrund war, kam der Ton einfach nicht heraus.

Die Benachrichtigung wurde vom Server über FCM gesendet, dh der Server hat den JSON der Benachrichtigung bereitgestellt und an FCM gesendet, der die Benachrichtigung dann an die Apps sendet. Selbst wenn ich das Sound-Tag anbringe, kommt der Sound im Hintergrund nicht heraus.

Geben Sie hier die Bildbeschreibung ein

Sogar das Setzen des Sound-Tags hat nicht funktioniert.

Geben Sie hier die Bildbeschreibung ein

Nach so viel Suche fand ich die Lösung in einem Github-Forum. Ich bemerkte dann, dass es in meinem Fall zwei Probleme gab:

1 - Es fehlte das Senden des Tags channel_id, was für die Arbeit mit API-Level 26+ wichtig ist

Geben Sie hier die Bildbeschreibung ein

2 - In der Android-Anwendung musste ich für diesen speziellen Fall, in dem Benachrichtigungen direkt vom Server gesendet wurden, die Kanal-ID im Voraus konfigurieren. In meiner Hauptaktivität musste ich den Kanal so konfigurieren, dass Android wusste, was wann zu tun ist Benachrichtigung angekommen.

In vom Server gesendetem JSON:

   {
  "title": string,
  "body": string,
  "icon": string,
  "color": string,
  "sound": mysound,

  "channel_id": videocall,
  //More stuff here ...
 }

In Ihrer Hauptaktivität:

 @Background
    void createChannel(){
            Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
            NotificationChannel mChannel;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
                mChannel.setLightColor(Color.GRAY);
                mChannel.enableLights(true);
                mChannel.setDescription("VIDEO CALL");
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                mChannel.setSound(sound, audioAttributes);

                NotificationManager notificationManager =
                        (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(mChannel);
            }
    }

Dies hat mein Problem endlich gelöst. Ich hoffe, es hilft jemandem, nicht 2 Tage wie ich zu verschwenden. Ich weiß nicht, ob es für alles notwendig ist, was ich in den Code eingefügt habe, aber das ist der Weg. Ich habe auch den Link zum Github-Forum nicht mehr gefunden, um die Antwort gutzuschreiben, da ich das gleiche getan habe, das dort gepostet wurde.

Rafael Rocha
quelle
2

mag das

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

    Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(sound);

}
AAA
quelle
6
onMessageReceived wird nicht aufgerufen, wenn sich die App im Hintergrund befindet. Eigentlich ist dies ein Problem, mit dem ich konfrontiert bin
Developine
Haben Sie dies (Firebase.setAndroidContext (getApplicationContext ());) von der Hauptaktivität
AAA
Nein, ich habe nicht. aber jetzt spiele ich die Benachrichtigungsantwort von isl, die für mich gearbeitet hat.
Developine
Bitte sagen Sie mir, Builder ist Fehler generiert Bitte Builder definieren
Ashish Shahi
Builder ist Benachrichtigungscompat Builder
AAA
1

Versuche dies....

  public  void buildPushNotification(Context ctx, String content, int icon, CharSequence text, boolean silent) {
    Intent intent = new Intent(ctx, Activity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1410, intent, PendingIntent.FLAG_ONE_SHOT);

    Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), //large drawable);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
            .setSmallIcon(icon)
            .setLargeIcon(bm)
            .setContentTitle(content)
            .setContentText(text)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);

    if(!silent)
       notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

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

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

und in onMessageReceived rufen Sie es auf

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    Log.d("Msg", "Message received [" + remoteMessage.getNotification().getBody() + "]");

    buildPushNotification(/*your param*/);
}

oder folge KongJing , ist auch richtig, wie er sagt, aber du kannst eine Firebase-Konsole verwenden.

chry
quelle
0

Ich kann Benachrichtigungston wiedergeben, auch wenn ich ihn von der Firebase-Konsole sende. Dazu müssen Sie nur die Taste "Sound" mit dem Wert "Standard" im Voraus hinzufügen.

Saeed Sharman
quelle
Ihre Idee ist Arbeit, aber ich musste das Benachrichtigungsbild ändern, wenn das Telefon gesperrt ist. Wie kann ich es ändern? Bitte helfen Sie mir
Ashish Shahi
Ich versuche Sie vorherige Idee, aber nicht arbeiten Bitte helfen Sie Es ist so dringend
Ashish Shahi