No hay sonido de notificación al enviar una notificación desde firebase en Android

81

Estoy enviando una notificación push desde firebase a mi aplicación de Android. pero cuando mi aplicación está en segundo plano, no se llama al método firebase onMessageReceived, en su lugar, firebase envía una notificación al sistema para mostrar la notificación en la bandeja del sistema. la notificación aparece en la bandeja del sistema pero no hay sonido para la notificación, incluso si he permitido el sonido de notificación para mi aplicación en la configuración del sistema.

qué puedo hacer para reproducir el sonido de notificación cuando se recibe una notificación de firebase.

Esta es la forma en que estoy enviando una notificación de base de fuego a mi aplicación enlace Blogpost .

Cómo agregar firebase en su aplicación de Android

Developine
fuente
1
Por favor refiérase a esta respuesta ..
geekoraul
Hola chicos, mi problema se resolvió. lea esta publicación para obtener más detalles. developmentine.com/…
Developine
asegúrese de verificar la configuración de notificaciones para esa aplicación
maheshmnj

Respuestas:

113

En la carga útil de notificación de la notificación hay una clave de sonido.

De la documentación oficial su uso es:

Indica un sonido para reproducir cuando el dispositivo recibe una notificación. Admite el nombre de archivo o predeterminado de un recurso de sonido incluido en la aplicación. Los archivos de sonido deben residir en / res / raw /.

P.ej:

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

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

Si desea utilizar el sonido predeterminado del dispositivo, se debe utilizar: "sound": "default".

Consulte este enlace para ver todas las claves posibles en las cargas útiles: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

Para aquellos que no saben, firebase maneja las notificaciones de manera diferente cuando la aplicación está en segundo plano. En este caso, no se llama a la función onMessageReceived.

Cuando su aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario que toca la notificación abre el iniciador de aplicaciones de forma predeterminada. Esto incluye mensajes que contienen notificación y carga útil de datos. En estos casos, la notificación se envía a la bandeja del sistema del dispositivo y la carga útil de datos se entrega en los extras de la intención de su actividad de iniciador.

Isj
fuente
23
si desea usar el sonido predeterminado del dispositivo, debe usar: "sonido": "predeterminado"
Brian Vo
@TranVo gracias por señalar que el valor "predeterminado" reproduce el sonido predeterminado del dispositivo, ¡me ahorraste mucho tiempo!
Mattia Ruggiero
1
Intenté todas las formas posibles, pero no pude tener ese sonido o sonido predeterminado al establecer mi propio tono y tampoco recibir vibración, cuál puede ser la razón
santhosh
1
Entonces, ¿cómo puedo desactivar el sonido de la notificación?
iamatsundere181
1
¿El nuevo sistema de canal de notificación ha obsoleto esta API para dispositivos más antiguos o todavía funciona para dispositivos más antiguos? He estado tratando de hacer que aparezcan sonidos personalizados para un dispositivo Nougat, pero parece que obtengo el efecto de sonido de timbre predeterminado sin importar lo que ingrese en "sonido" o "soundName". He intentado "mysoundeffect.wav" y "mysoundeffect" sin suerte.
John Gorenfeld
26

opciones avanzadas seleccione opciones avanzadas cuando escriba un mensaje y elija sonido activado elegir activado

esta es mi solución

KongJing
fuente
@KongJing en Android 8 y superior, siempre tiene sonido sin importar la configuración de la consola de Firebase. ¿Conoce una forma de evitar el sonido por completo?
Think Twice Code Once
Lamento ver esto tan tarde, no puedo resolver este problema. @ Think Twice Code Once
KongJing
22

Prueba esto

{
    "to" : "DEVICE-TOKEN",

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

@nota para sonido de notificación personalizado: -> "sound" : "MyCustomeSound.wav"

Sameer
fuente
1
Entonces, ¿dónde pones ese archivo? en crudo? ¿bienes?
Hamzeh Soboh
3
No carpeta de activos, cree una nueva carpeta bajo res, llámela sin procesar. Luego copie y pegue su archivo wav o mp3 en esa carpeta. @HamzehSoboh
Ally Makongo
12

El onMessageReceivedmétodo se activa solo cuando la aplicación está en primer plano o la carga útil de notificación solo contiene el tipo de datos.

De los documentos de Firebase

Para la mensajería descendente, FCM proporciona dos tipos de carga útil: notificación y datos .

Para el tipo de notificación , FCM muestra automáticamente el mensaje a los dispositivos del usuario final en nombre de la aplicación cliente. Las notificaciones tienen un conjunto predefinido de claves visibles para el usuario.
Para el tipo de datos , la aplicación cliente es responsable de procesar los mensajes de datos. Los mensajes de datos solo tienen pares clave-valor personalizados.

Utilice notificaciones cuando desee que FCM se encargue de mostrar una notificación en nombre de su aplicación cliente. Use mensajes de datos cuando desee que su aplicación maneje la pantalla o procese los mensajes en su aplicación cliente de Android, o si desea enviar mensajes a dispositivos iOS cuando hay una conexión FCM directa.

Más abajo en los documentos

El comportamiento de la aplicación al recibir mensajes que incluyen tanto notificaciones como cargas útiles de datos depende de si la aplicación está en segundo plano o en primer plano, esencialmente, si está activa o no en el momento de la recepción.
Cuando están en segundo plano , las aplicaciones reciben la carga útil de notificaciones en la bandeja de notificaciones y solo manejan la carga útil de datos cuando el usuario toca la notificación.
Cuando está en primer plano , su aplicación recibe un objeto de mensaje con ambas cargas útiles disponibles.

Si está utilizando la consola de base de fuego para enviar notificaciones, la carga útil siempre contendrá el tipo de notificación. Tienes que usar la API de Firebase para enviar la notificación solo con el tipo de datos en la carga útil de la notificación. De esa manera, su aplicación siempre recibe una notificación cuando se recibe una nueva notificación y la aplicación puede manejar la carga útil de la notificación.

Si desea reproducir un sonido de notificación cuando la aplicación está en segundo plano utilizando el método convencional, debe agregar el parámetro de sonido a la carga útil de la notificación.

Renjith
fuente
No, también se llama cuando la aplicación está cerrada, pero debe permitir el inicio automático de la aplicación.
funky-nd
10

Con HTTP v1 API es diferente

Documentación

Ejemplo:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}
Andrés
fuente
¿cómo escribir esto en php?
Tabish Khan
@Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz
5

También tenía un problema con las notificaciones que tenían que emitir sonido, cuando la aplicación estaba en primer plano todo funcionaba correctamente, sin embargo, cuando la aplicación estaba en segundo plano, el sonido simplemente no salía.

La notificación fue enviada por el servidor a través de FCM, es decir, el servidor montó el JSON de la notificación y la envió a FCM, que luego envía la notificación a las aplicaciones. Incluso si pongo la etiqueta de sonido, el sonido no sale en el fondo.

ingrese la descripción de la imagen aquí

Incluso poner la etiqueta de sonido no funcionó.

ingrese la descripción de la imagen aquí

Después de tanto buscar encontré la solución en un foro de github. Luego noté que había dos problemas en mi caso:

1 - Faltaba enviar la etiqueta channel_id, importante para trabajar en API nivel 26+

ingrese la descripción de la imagen aquí

2 - En la aplicación de Android, para este caso específico donde las notificaciones se enviaban directamente desde el servidor, tuve que configurar el id del canal con anticipación, por lo que en mi Actividad principal tuve que configurar el canal para que Android supiera qué hacer cuando llegó la notificación.

En JSON enviado por el servidor:

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

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

En tu actividad principal:

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

Esto finalmente resolvió mi problema, espero que ayude a alguien a no perder 2 días como lo hice yo. No sé si es necesario para todo lo que pongo en el código, pero así es. Tampoco encontré el enlace del foro de github para acreditar la respuesta, porque lo que hice fue el mismo que se publicó allí.

Rafael Rocha
fuente
2

hazlo así

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}
AAA
fuente
6
onMessageReceived no se llama cuando la aplicación está en segundo plano. en realidad, este es un problema al que me enfrento
Developine
¿llamó a esto (Firebase.setAndroidContext (getApplicationContext ());) desde la actividad principal
AAA
no, no lo he hecho. pero ahora estoy reproduciendo la respuesta de notificación de isl que funcionó para mí.
Developine
por favor dígame el constructor se genera un error por favor defina constructor
Ashish Shahi
constructor es un constructor de notificacióncompat
AAA
1

prueba esto....

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

y en onMessageReceived, llámalo

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


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

    buildPushNotification(/*your param*/);
}

o siga a KongJing , también es correcto como él dice, pero puede usar una consola de Firebase.

chry
fuente
0

Puedo reproducir el sonido de notificación incluso si lo envío desde la consola de base de fuego. Para hacer eso, solo necesita agregar la tecla "sonido" con el valor "predeterminado" en la opción de antemano.

Saeed Sharman
fuente
Tu idea es un trabajo Pero he requerido cambiar la imagen de notificación cuando el teléfono está bloqueado ¿Cómo puedo cambiar? Por favor, ayúdame
Ashish Shahi
Estoy probando tu idea anterior, pero no funciona. Por favor, ayuda. Es tan urgente.
Ashish Shahi