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 .
Odpowiedzi:
W ładunku powiadomienia powiadomienia znajduje się klucz dźwiękowy.
Z oficjalnej dokumentacji jego użycie jest następujące:
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.
źródło
wybierz opcje zaawansowane podczas Napisz wiadomość i wybierz opcję aktywacji dźwiękiem
to jest moje rozwiązanie
źródło
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"
źródło
onMessageReceived
Metoda jest zwolniony tylko wtedy, gdy aplikacja jest w planie lub ładunek zgłoszenie zawiera tylko typ danych.Z dokumentacji Firebase
Dalej w dokumentach
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.
źródło
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" } } } }
źródło
$this->message['message']['android']['notification']['sound'] = "default";
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.
Nawet umieszczenie etykiety dźwiękowej nie zadziałało.
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+
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.
źródło
rób jak to
@Override public void onMessageReceived(RemoteMessage remoteMessage) { //codes..,.,, Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); builder.setSound(sound); }
źródło
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()); }
@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.
źródło
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".
źródło