2010-04-11 28 views
96

He estado buscando en todas partes cómo reproducir un tono de llamada/sonido de alarma en Android.Cómo reproducir tono de llamada/sonido de alarma en Android

Presiono un botón y quiero reproducir un tono de llamada/alarma. No pude encontrar una muestra fácil y directa. Sí, ya miré el código fuente del reloj de alarma ... pero no es sencillo y no puedo compilarlo.

no puedo hacer este trabajo:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setDataSource(this, alert); 
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { 
    player.setAudioStreamType(AudioManager.STREAM_ALARM); 
    player.setLooping(true); 
    player.prepare(); 
    player.start(); 
} 

consigo este error:

04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for 
content://settings/system/ringtone 

Así que .. por favor si alguien sabe cómo jugar un tono de llamada/alarma por defecto que me haga saber.

Prefiero no cargar ningún archivo. Simplemente reproduce un tono de llamada predeterminado.

Respuesta

15

Su ejemplo es básicamente lo que estoy usando. Sin embargo, nunca funciona en el emulador, porque el emulador no tiene tonos de llamada por defecto, y content://settings/system/ringtone no se resuelve en nada reproducible. Funciona bien en mi teléfono real.

9

Puede insertar un archivo MP3 en su carpeta/sdcard usando DDMS, reiniciar el emulador, abrir la aplicación Multimedia, buscar su archivo MP3, presionarlo largamente y seleccionar "Usar como tono de llamada del teléfono".

¡Error!

Editar: mismo problema con los sonidos de notificación (por ejemplo, para SMS) resuelve utilizando la aplicación Ringdroid

2

copia de un archivo de audio a la tarjeta SD del emulador y seleccionándolo a través de reproductor de medios como el tono de llamada predeterminado en efecto, a resolver el problema .

56

Si un usuario nunca ha configurado una alarma en su teléfono, TYPE_ALARM puede devolver nulo. Se puede dar cuenta de esto con:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 

if(alert == null){ 
    // alert is null, using backup 
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

    // I can't see this ever being null (as always have a default notification) 
    // but just incase 
    if(alert == null) { 
     // alert backup is null, using 2nd backup 
     alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);     
    } 
} 
+1

El URI volvió podría no ser 'null' a pesar de que no apunta a un sonido válido. Debería probar el valor de retorno de 'RingtoneManager.getRingtone()' para 'null' en su lugar/como-bien – Attila

+0

En 2017, no se está trabajando para no sonar. ¿Lo tienes funcionando en Android reciente? – YumYumYum

+0

@YumYumYum Funciona para mí en el emulador. –

159

Simplemente puede jugar un tono Setted con esto:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
r.play(); 
+0

Todavía me sale un error - No se pudo abrir el contenido del tono de llamada: // settings/system/alarm_alert –

+3

Agradable y simple. Sin embargo, dependiendo del dispositivo, este método puede interrumpir otros sonidos (como música) que podrían estar sonando en Android. – igordcard

+0

Usar getApplicationContext() podría no ser una muy buena opción. Más información aquí: http://stackoverflow.com/questions/9122627/should-i-use-getapplicationcontext-or-activity-this-in-a-long-running-asynctask – Saket

8

Esto funciona bien:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
MediaPlayer thePlayer = MediaPlayer.create(getApplicationContext(), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 

try { 
    thePlayer.setVolume((float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION)/7.0)), 
         (float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION)/7.0))); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

thePlayer.start(); 
+2

¿Por qué está ¿Dividir el volumen en 7,0? ¿Es un valor de trabajo comúnmente conocido o algo que sacas tú mismo? –

+0

Algo que desenterré ...: D –

+0

llamando alPlayer.prepare() es inútil, MediaPlayer.create lo hace por ti – onizukaek

45

Ésta es la manera que he hecho :

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification); 
mp.start(); 

Es similar a ma rkov00, pero usa MediaPlayer en lugar de tono de llamada, lo que evita la interrupción de otros sonidos, como la música, que podrían estar sonando en segundo plano.

+3

Intenté la respuesta superior (ringtone.play) pero el sonido puede ser cortado. Usé este enfoque y funcionó perfectamente. – wyz

+1

Esta es una mejor solución para cualquier persona que use cualquier otro componente de audio en su aplicación. – EntangledLoops

+0

@YumYumYum, acabo de probar y funciona. No hice nada más que poner el código anterior en mi setOnClickListner. ¿Qué hiciste? –

-1

He aquí algunos ejemplos de código:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification); 
mediaPlayer.start(); 
+0

Explique el código con una pequeña explicación, no se agradecen las respuestas con solo el código. –

+0

Vamos hombre, probablemente nunca leas las respuestas de arriba. stackoverflow.com/a/20177743/3332634 – yshahak

2

Usted podría utilizar este código de ejemplo:

Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri) 

if (ringtoneSound != null) { 
    ringtoneSound.play(); 
} 
2
public class AlarmReceiver extends WakefulBroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     //this will update the UI with message 
     Reminder inst = Reminder.instance(); 
     inst.setAlarmText(""); 

     //this will sound the alarm tone 
     //this will sound the alarm once, if you wish to 
     //raise alarm in loop continuously then use MediaPlayer and setLooping(true) 
     Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
     if (alarmUri == null) { 
      alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
     } 
     Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri); 
     ringtone.play(); 

     //this will send a notification message 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       AlarmService.class.getName()); 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 
} 
4

para el futuro de Google: utilizar RingtoneManager.getActualDefaultRingtoneUri() en lugar de RingtoneManager.getDefaultUri(). De acuerdo con su nombre, devolvería el uri real, por lo que puede usarlo libremente.A partir de la documentación de getActualDefaultRingtoneUri():

Gets the current default sound's Uri. This will give the actual sound Uri, instead of using this, most clients can use DEFAULT_RINGTONE_URI.

Mientras tanto getDefaultUri() dice esto:

Returns the Uri for the default ringtone of a particular type. Rather than returning the actual ringtone's sound Uri, this will return the symbolic Uri which will resolved to the actual sound when played.

+0

esto funciona. Gracias –

+0

@ V.Kalyuzhnyu siempre contento de ayudar –

Cuestiones relacionadas