2010-12-14 15 views
130

Me preguntaba cómo podría reproducir un sonido de notificación sin reproducirlo en el flujo de medios. Ahora mismo puedo hacerlo 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 o alerta o un tono de llamada. Aquí está un ejemplo de lo que mi código es el momento:Cómo reproducir un sonido de notificación de Android

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

Respuesta

337

Si alguien está todavía en busca de una solución a esto, he encontrado una respuesta a How to play ringtone/alarm sound in Android

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

Puede cambiar TYPE_NOTIFICATION a TYPE_ALARM, pero usted querrá mantener un registro de su tono r con el fin de detener Jugando ... digamos, cuando el usuario hace clic en un botón o algo.

+1

Los teléfonos de Motorola, por ejemplo, extendieron la actividad de preferencias y le 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. ¿Tienes alguna idea de cómo resolver este problema? – David

+2

Recibí un error con esto: 'MediaPlayer - Debería haber configurado el controlador de subtítulos'. Qué significa eso? – Deqing

+0

Al usar esta solución, después de 28/29 veces, los sonidos dejan de reproducirse. Alguien sabe por qué? –

1

Usted puede utilizar Notification y NotificationManager para mostrar la notificación que desee. Luego puede personalizar el sonido que desea reproducir con su notificación.

+4

No deseo mostrar una notificación, solo quiero reproducir el sonido. – ninjasense

0

Creo que el concepto de "sonido de notificación" de alguna manera 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 reproduces un sonido de notificación sin el ícono de la barra de estado, consigues confundir al usuario ("¿Qué fue ese sonido? ¿No hay un ícono aquí, quizás tengo problemas de audición?").

Cómo configurar el sonido de una notificación es, por ejemplo, aquí: Setting sound for notification

+0

No realmente, esto puede ser una notificación en 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 callen cuando el teléfono está en modo silencioso. – copolii

+0

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

9

Ha sido un tiempo desde su pregunta, pero ... ¿Usted ha intentado fijar el tipo de flujo de audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

Debe hacerse antes de la preparación.

1

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

Sin embargo, hay un pequeño ajuste de la API de notificación 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 funcionará para ti.

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

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, también podría tener un mensaje de ticker en la barra de notificaciones; puede hacerlo 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 toda la biblioteca desde su Subversion repository y compilarla con Maven. Depende de globalmentor-core library, que también se puede construir e instalar con Maven.

+0

Eso es complicado de simplemente reproducir un sonido. Simplemente puede hacer esto: http://stackoverflow.com/a/9622040/1417267 – slinden77

193

Ahora puede hacer esto al incluir 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()); 
+11

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. –

+6

Quizás también deba 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

+0

@Rob Riddle Está funcionando bien. pero en caso de notificaciones múltiples, p. 100 notificaciones paralelas al sonido se mezclan con el sonido de la próxima notificación. lógicamente, si el sonido ya se está reproduciendo, debe esperar a que finalice la reproducción anterior. ¿Puedes ayudarme en este escenario? –

7

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

Si desea un sonido de notificación por defecto que se jugará, a continuación, puede utilizar 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 el más fácil forma de lograr su tarea.

Cuestiones relacionadas