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,
}
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í.