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 .
Respuestas:
En la carga útil de notificación de la notificación hay una clave de sonido.
De la documentación oficial su uso es:
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.
fuente
seleccione opciones avanzadas cuando escriba un mensaje y elija sonido activado
esta es mi solución
fuente
Prueba esto
{ "to" : "DEVICE-TOKEN", "notification" : { "body" : "NOTIFICATION BODY", "title" : "NOTIFICATION TITILE", "sound" : "default" } }
@nota para sonido de notificación personalizado: ->
"sound" : "MyCustomeSound.wav"
fuente
El
onMessageReceived
mé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
Más abajo en los documentos
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.
fuente
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" } } } }
fuente
$this->message['message']['android']['notification']['sound'] = "default";
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.
Incluso poner la etiqueta de sonido no funcionó.
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+
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í.
fuente
hazlo así
@Override public void onMessageReceived(RemoteMessage remoteMessage) { //codes..,.,, Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); builder.setSound(sound); }
fuente
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()); }
@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.
fuente
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.
fuente