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

169

Me preguntaba cómo podría reproducir un sonido de notificación sin reproducirlo en la transmisión de medios. En este momento 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 tono de llamada. He aquí 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();
ninjasense
fuente

Respuestas:

421

Si alguien todavía está buscando una solución a esto, encontré una respuesta en Cómo reproducir tonos de llamada / alarmas en 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 querrá realizar un seguimiento de su tono de llamada r para dejar de reproducirlo ... digamos, cuando el usuario hace clic en un botón o algo.

Fidio
fuente
2
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. ¿Tienes alguna idea de cómo resolver este problema?
David
2
Tengo un error con esto: MediaPlayer - Should have subtitle controller already set. Qué significa eso?
Deqing
Usando esta solución, después de 28/29 veces, los sonidos dejan de reproducirse. Alguien sabe por qué?
Tom Brinkkemper
1
¿Por qué capturas cada excepción? ¿Cuál puede ser arrojado?
Miha_x64
2
@ Sam, sí. stackoverflow.com/q/39876885/2614353 . Básicamente , no cree un objeto RingTone cada vez que lo juegue. Créelo una vez y luego juegue el mismo objeto varias veces.
Tom Brinkkemper
205

Ahora puede hacerlo incluyendo el sonido al crear una notificación en lugar de llamarlo 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());
Rob Riddle
fuente
12
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.
Fabian Tamp
77
Quizás también debería configurarlo 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. ¿Pueden ayudarme en este escenario?
Waqas Ali Razzaq
no reproduce el sonido cuando la aplicación está en segundo plano. ¿cualquier sugerencia?
Sagar Nayak
47

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

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 esa es la forma más fácil de cumplir con su tarea.

aga
fuente
no reproduce el sonido cuando la aplicación está en segundo plano. ¿cualquier sugerencia?
Sagar Nayak
13

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

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

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Debe hacerse antes de prepararse.

copolii
fuente
2

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 sobre el argumento en algunas de las otras respuestas de que si estás reproduciendo un sonido de notificación, también deberías presentar algún mensaje de notificación.

Sin embargo, 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 funcione para ti.

He creado un conjunto de métodos convenientes en los com.globalmentor.android.app.Notifications.javaque le permite crear un sonido de notificación como este:

Notifications.notify(this);

El LED también parpadeará y, si tiene permiso para vibrar, 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, puede darse cuenta de que, dado que la notificación desaparecerá de todos modos, también podría tener 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 toda la biblioteca desde su repositorio Subversion y compilarla con Maven. Depende de la biblioteca globalmentor-core, que también se puede construir e instalar con Maven.

Garret Wilson
fuente
Es muy complicado simplemente reproducir un sonido. Puede hacer esto: stackoverflow.com/a/9622040/1417267
slinden77
1

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

Valentin Rocher
fuente
55
No deseo mostrar una notificación, solo quiero reproducir el sonido.
ninjasense
1

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

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

Aquí, por ejemplo, cómo configurar el sonido en una notificación: Configuración del sonido para la notificación

think01
fuente
1
En realidad no, 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
Bueno, tienes razón, pero eso es otra cosa. Estaba hablando (suponiendo que este fuera 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.
think01
1
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());
    }
}
dsc clg
fuente
1
Gracias por este fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría en gran medida su valor a largo plazo al mostrar por qué esta es una buena solución al problema y la haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
NOh
0

Establecer sonido al 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);
Milind Chaudhary
fuente