Cómo reproducir un sonido de notificación de Android

Me preguntaba cómo podría reproducir un sonido de notificación sin reproducirlo en el flujo de medios. Ahora mismo puedo hacer esto a través del reproductor multimedia, sin embargo, no quiero que se reproduzca como un archivo multimedia, quiero que se reproduzca como una notificación, alerta o tono de llamada. aquí hay un ejemplo de cómo se ve mi código en este momento:

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

preguntado el 14 de diciembre de 10 a las 13:12

10 Respuestas

Si alguien todavía está buscando una solución a esto, encontré una respuesta en Cómo reproducir tono de llamada / sonido de alarma en Android

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

Puedes cambiar TYPE_NOTIFICATION a TYPE_ALARM, pero querrás hacer un seguimiento de tu Ringtone r para dejar de reproducirlo ... digamos, cuando el usuario hace clic en un botón o algo.

contestado el 23 de mayo de 17 a las 13:05

Los teléfonos Motorola, por ejemplo, ampliaron la actividad de preferencias y permiten al usuario definir un sonido de notificación para sms y otras categorías. El método anterior no funcionará con este tipo de teléfonos. ¿Tiene alguna idea de cómo solucionar este problema? - David

Tengo un error con esto: MediaPlayer - Should have subtitle controller already set. ¿Qué significa? - Deqing

Usando esta solución, después de 28/29 veces, los sonidos dejan de reproducirse. ¿Alguien sabe por qué? - Tom Bevelander

¿Por qué detecta todas las excepciones? ¿Cuál se puede lanzar? - miha_x64

@Sam, sí. stackoverflow.com/q/39876885/2614353. Básicamente, no cree un objeto RingTone cada vez que lo reproduzca. Créelo una vez y luego reproduzca el mismo objeto varias veces. - Tom Bevelander

Ahora puede hacer esto incluyendo el sonido al crear una notificación en lugar de llamar al sonido por separado.

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

Respondido el 28 de enero de 13 a las 21:01

Esto resuelve un problema diferente: no "cómo reproducir un sonido de notificación", sino "cómo reproducir una notificación y mostrar un sonido ". La respuesta aceptada se justifica en su solución. Fabián Tamp

Quizás también debería configurar esto para que se reproduzca a través de STREAM_NOTIFICATION para que se reproduzca con la preferencia de volumen de notificación actual del sistema operativo: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION) - mwk

@Rob Riddle Está funcionando bien. pero en caso de múltiples notificaciones, por ejemplo, 100 notificaciones paralelas, el sonido se mezcla con el siguiente sonido de notificación. lógicamente, si el sonido ya se está reproduciendo, debe esperar a que se complete la reproducción anterior. ¿Puedes ayudar en este escenario? - Waqas Ali Razzaq

no reproducir el sonido cuando la aplicación está en segundo plano. ¿cualquier sugerencia? - Sagar Nayak

Si desea que se reproduzca un sonido de notificación predeterminado, puede usar setDefaults (int) método de NotificationCompat.Builder clase:

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

Creo que es la forma más sencilla de realizar su tarea.

respondido 27 mar '14, 11:03

no reproducir el sonido cuando la aplicación está en segundo plano. ¿cualquier sugerencia? - Sagar Nayak

Prueba esto:

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

Respondido 21 Feb 14, 12:02

Ha pasado un tiempo desde su pregunta, pero ... ¿Ha intentado configurar el tipo de flujo de audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Debe hacerse antes de preparar.

Respondido el 14 de Septiembre de 11 a las 20:09

Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

respondido 15 mar '18, 12:03

Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. A explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor editar su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. - NO

Tenía prácticamente la misma pregunta. Después de investigar un poco, creo que si quieres reproducir el "sonido de notificación" del sistema predeterminado, tienes que mostrar una notificación y decirle que use el sonido predeterminado. Y hay algo que decir sobre el argumento en algunas de las otras respuestas de que si está reproduciendo un sonido de notificación, también debería presentar algún mensaje de notificación.

Sin embargo, un pequeño ajuste de la API de notificaciones y puede acercarse a lo que desea. Puede mostrar una notificación en blanco y luego eliminarla automáticamente después de unos segundos. Creo que esto funcionará para mí; tal vez funcione para usted.

He creado un conjunto de métodos de conveniencia en com.globalmentor.android.app.Notifications.java que te permiten crear un sonido de notificación como este:

Notifications.notify(this);

El LED también parpadeará y, si tiene permiso de vibración, se producirá una vibración. Sí, aparecerá un icono de notificación en la barra de notificaciones, pero desaparecerá después de unos segundos.

En este punto, es posible que se dé cuenta de que, dado que la notificación desaparecerá de todos modos, es posible que también tenga un mensaje de desplazamiento en la barra de notificaciones; puedes hacer eso así:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

Hay muchos otros métodos de conveniencia en esta clase. Puede descargar la biblioteca completa desde su repositorio de Subversion y compilarla con Maven. Depende de la biblioteca globalmentor-core, que también se puede construir e instalar con Maven.

Respondido 05 Feb 19, 08:02

Eso es demasiado complicado para simplemente reproducir un sonido. Podrías hacer esto: stackoverflow.com/a/9622040/1417267 - slinden77

Puede usar el Notificación y Administrador de notificaciones para mostrar la notificación que desea. Luego, puede personalizar el sonido que desea reproducir con su notificación.

Respondido el 14 de diciembre de 10 a las 16:12

No deseo mostrar una notificación, solo quiero reproducir el sonido. - sentido ninja

Creo que el concepto de "sonido de notificación" es incorrecto para la interfaz de usuario de Android.

El comportamiento esperado de Android es utilizar la Notificación estándar para alertar al usuario. Si reproduce un sonido de notificación sin el ícono de la barra de estado, confunde al usuario ("¿Qué era ese sonido? No hay un ícono aquí, ¿tal vez tengo problemas de audición?").

Cómo configurar el sonido en una notificación es, por ejemplo, aquí: Configuración de sonido para notificación

contestado el 23 de mayo de 17 a las 13:05

Realmente no, esta puede ser una notificación dentro de la aplicación. Por ejemplo, si está en una aplicación de chat y tiene pequeños efectos de sonido para los mensajes entrantes y salientes. Esas son notificaciones en esencia y desea que se apaguen cuando el teléfono esté en modo silencioso. - copolii

Bueno, tienes razón, pero eso es otra cosa. Estaba hablando (asumiendo que este era el tema de la pregunta) de "sonidos de notificación del sistema", que está en la GUI de Android del sistema. Por supuesto, cuando estás en tu propia aplicación, todo depende de ti. - pensar01

Establecer sonido en el canal de notificación

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);

Respondido 05 Feb 19, 07:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.