Brak dźwięku powiadomienia podczas wysyłania powiadomienia z firebase w systemie Android

83

Wysyłam powiadomienie push z firebase do mojej aplikacji na Androida. ale kiedy moja aplikacja działa w tle, metoda onMessageReceived firebase nie jest wywoływana, zamiast tego firebase wysyła powiadomienie do systemu w celu wyświetlenia powiadomienia w zasobniku systemowym. powiadomienie pojawia się na pasku zadań, ale nie ma dźwięku powiadomienia, nawet jeśli zezwoliłem na dźwięk powiadomienia dla mojej aplikacji w ustawieniach systemu.

co mogę zrobić, aby odtworzyć dźwięk powiadomienia po otrzymaniu powiadomienia z firebase.

W ten sposób wysyłam powiadomienie z firebase na link do mojej aplikacji w blogu .

Jak dodać firebase do aplikacji na Androida

Rozwijaj
źródło
1
Proszę odnieść się do tej odpowiedzi ..
geekoraul
sprawdź ustawienia powiadomień dla tej aplikacji
maheshmnj
@Developine: Twój link zniknął !! (developine.com / ...)
Anh Nguyen

Odpowiedzi:

114

W ładunku powiadomienia powiadomienia znajduje się klucz dźwiękowy.

Z oficjalnej dokumentacji jego użycie jest następujące:

Wskazuje dźwięk do odtworzenia, gdy urządzenie otrzyma powiadomienie. Obsługuje domyślne lub nazwę pliku zasobu dźwiękowego zawartego w aplikacji. Pliki dźwiękowe muszą znajdować się w / res / raw /.

Na przykład:

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

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

Jeśli chcesz użyć domyślnego dźwięku urządzenia, należy użyć: "sound": "default".

Zobacz ten link, aby uzyskać wszystkie możliwe klucze w ładunkach: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

Dla tych, którzy nie znają Firebase, inaczej traktuje powiadomienia, gdy aplikacja działa w tle. W tym przypadku funkcja onMessageReceived nie jest wywoływana.

Gdy Twoja aplikacja działa w tle, Android kieruje powiadomienia do paska zadań. Stuknięcie przez użytkownika powiadomienia powoduje domyślnie otwarcie programu uruchamiającego aplikacje. Obejmuje to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych. W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach intencji działania programu uruchamiającego.

Isj
źródło
23
jeśli chcesz użyć domyślnego dźwięku urządzenia, powinieneś użyć: "sound": "default"
Brian Vo
@TranVo dzięki za zwraca uwagę, że wartość „default” odtwarza domyślny dźwięk urządzenia, zaoszczędziłeś mi dużo czasu!
Mattia Ruggiero
1
Próbowałem wszystkich możliwych sposobów, ale nie byłem w stanie uzyskać tego domyślnego dźwięku lub dźwięku po ustawieniu własnego tonu, a także braku wibracji, co może być przyczyną
Santhosh
1
Jak więc mogę wyłączyć dźwięk powiadomienia?
iamatsundere181
1
Czy nowy system kanału powiadomień przestał obowiązywać ten interfejs API w przypadku starszych urządzeń, czy nadal działa na starszych urządzeniach? Próbowałem, aby niestandardowe dźwięki pojawiały się dla urządzenia Nougat, ale po prostu wydaje mi się, że otrzymuję domyślny efekt dźwiękowy gongu, niezależnie od tego, co wpisuję w „sound” lub „soundName”. Próbowałem "mysoundeffect.wav" i "mysoundeffect" bez powodzenia.
John Gorenfeld
26

adavaced opcje wybierz opcje zaawansowane podczas Napisz wiadomość i wybierz opcję aktywacji dźwiękiem wybierz aktywowany

to jest moje rozwiązanie

KongJing
źródło
@KongJing w systemie Android 8 i nowszych, zawsze ma dźwięk bez względu na ustawienie konsoli Firebase. Czy znasz sposób na całkowite wyeliminowanie dźwięku?
Pomyśl dwa razy Kod raz
Przykro mi, że widzę to tak późno, nie mogę rozwiązać tego problemu. @ Think Twice Code Once
KongJing
24

Spróbuj tego

{
    "to" : "DEVICE-TOKEN",

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

@ Uwaga dotycząca niestandardowego dźwięku powiadomienia: -> "sound" : "MyCustomeSound.wav"

Sameer
źródło
1
Więc gdzie umieszczasz ten plik? na surowo? majątek?
Hamzeh Soboh
3
Nie folder zasobów, utwórz nowy folder pod res, nazwij go surowym. Następnie skopiuj i wklej plik wav lub mp3 do tego folderu. @HamzehSoboh
Ally Makongo
Umieszczam dźwięk w /res/raw/my_sound.mp3 w aplikacji na Androida, a następnie wywołuję API z „sound”: „my_sound.mp3”. Nie działa, odtwarzany był tylko dźwięk domyślny :( Ktoś taki jak ja?
Anh Nguyen,
Och, sprawię, że to zadziałało. Korzystając z kanału powiadomień Androida, więcej szczegółów tutaj: stackoverflow.com/questions/61142155/ ...
Anh Nguyen,
12

onMessageReceivedMetoda jest zwolniony tylko wtedy, gdy aplikacja jest w planie lub ładunek zgłoszenie zawiera tylko typ danych.

Z dokumentacji Firebase

W przypadku przesyłania komunikatów FCM udostępnia dwa typy ładunku: powiadomienia i dane .

W przypadku typu powiadomienia FCM automatycznie wyświetla wiadomość na urządzeniach użytkowników końcowych w imieniu aplikacji klienckiej. Powiadomienia mają predefiniowany zestaw kluczy widocznych dla użytkownika.
W przypadku typu danych aplikacja klienta jest odpowiedzialna za przetwarzanie komunikatów danych. Wiadomości z danymi zawierają tylko niestandardowe pary klucz-wartość.

Użyj powiadomień, jeśli chcesz, aby FCM obsługiwał wyświetlanie powiadomienia w imieniu aplikacji klienckiej. Używaj wiadomości danych, jeśli chcesz, aby aplikacja obsługiwała wyświetlanie lub przetwarzała wiadomości w aplikacji klienckiej na Androida lub jeśli chcesz wysyłać wiadomości do urządzeń z systemem iOS, gdy istnieje bezpośrednie połączenie FCM.

Dalej w dokumentach

Zachowanie aplikacji podczas odbierania wiadomości, które zawierają zarówno powiadomienia, jak i ładunki danych, zależy od tego, czy aplikacja działa w tle, czy na pierwszym planie - zasadniczo od tego, czy jest aktywna w momencie otrzymania.
Działając w tle , aplikacje odbierają ładunek powiadomienia w zasobniku powiadomień i obsługują ładunek danych tylko wtedy, gdy użytkownik kliknie powiadomienie.
Na pierwszym planie aplikacja otrzymuje obiekt komunikatu z dostępnymi obydwoma ładunkami.

Jeśli używasz konsoli Firebase do wysyłania powiadomień, ładunek zawsze będzie zawierał typ powiadomienia. Musisz użyć interfejsu API Firebase, aby wysłać powiadomienie tylko z typem danych w ładunku powiadomienia. Dzięki temu Twoja aplikacja jest zawsze powiadamiana o odebraniu nowego powiadomienia, a aplikacja może obsłużyć ładunek powiadomienia.

Jeśli chcesz odtwarzać dźwięk powiadomienia, gdy aplikacja działa w tle, przy użyciu konwencjonalnej metody, musisz dodać parametr dźwięku do ładunku powiadomienia.

Renjith
źródło
nie, jest również wywoływane, gdy aplikacja jest zamknięta, ale należy zezwolić na automatyczne uruchamianie aplikacji.
funky-nd
10

Z API HTTP v1 jest inaczej

Dokumentacja

Przykład:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}
Andrzej
źródło
jak napisać to w php?
Tabish khan
@Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz
7

Miałem też problem z powiadomieniami, które musiały emitować dźwięk, gdy aplikacja była na pierwszym planie, wszystko działało poprawnie, jednak gdy aplikacja była w tle, dźwięk po prostu się nie pojawiał.

Powiadomienie zostało wysłane przez serwer za pośrednictwem FCM, to znaczy serwer zamontował JSON powiadomienia i wysłał go do FCM, który następnie wysyła powiadomienie do aplikacji. Nawet jeśli wstawię etykietę dźwiękową, dźwięk nie wychodzi w tle.

wprowadź opis obrazu tutaj

Nawet umieszczenie etykiety dźwiękowej nie zadziałało.

wprowadź opis obrazu tutaj

Po tak wielu poszukiwaniach znalazłem rozwiązanie na forum github. Wtedy zauważyłem, że w moim przypadku były dwa problemy:

1 - Brakowało wysłania tagu channel_id, który jest ważny do pracy na poziomie API 26+

wprowadź opis obrazu tutaj

2 - W aplikacji na Androida, dla tego konkretnego przypadku, w którym powiadomienia były wysyłane bezpośrednio z serwera, musiałem wcześniej skonfigurować identyfikator kanału, więc w moim głównym działaniu musiałem skonfigurować kanał, aby Android wiedział, co robić, kiedy dotarło powiadomienie.

W JSON przesłanym przez serwer:

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

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

W Twojej głównej aktywności:

 @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);
            }
    }

To w końcu rozwiązało mój problem, mam nadzieję, że pomoże to komuś nie marnować 2 dni tak jak ja. Nie wiem, czy jest to konieczne do wszystkiego, co umieściłem w kodzie, ale tak jest. Nie znalazłem również linku do forum github, aby podać odpowiedź, ponieważ to, co zrobiłem, było tym samym, które zostało tam umieszczone.

Rafael Rocha
źródło
2

rób jak to

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}
AAA
źródło
6
onMessageReceived nie jest wywoływana, gdy aplikacja działa w tle. w rzeczywistości jest to problem, przed którym stoję
Developine
czy nazwałeś to (Firebase.setAndroidContext (getApplicationContext ());) z głównego działania
AAA
nie, nie mam. ale teraz odtwarzam odpowiedź na powiadomienie z isl działa dla mnie.
Developine
proszę, powiedz mi, że kreator jest generowany błąd proszę zdefiniować budowniczego
Ashish Shahi
builder to aplikacja do tworzenia powiadomień
AAA
1

Spróbuj tego....

  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());
    }

iw onMessageReceived, nazwij to

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


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

    buildPushNotification(/*your param*/);
}

lub podążaj za KongJingiem , jest również poprawny, jak mówi, ale możesz użyć konsoli Firebase.

chry
źródło
0

Jestem w stanie odtworzyć dźwięk powiadomienia, nawet jeśli wyślę go z konsoli Firebase. Aby to zrobić, wystarczy wcześniej dodać klucz "dźwięk" z wartością "domyślna".

Saeed Sharman
źródło
Twój pomysł jest praca, ale ja potrzebny do zmiany wizerunku powiadomienie, gdy telefon jest zablokowany Jak mogę zmienić Proszę mi pomóc
Ashish Shahi
Jestem wypróbować poprzedni pomysł, ale nie działa proszę o pomoc To jest tak pilna
Ashish Shahi