android - tonos - tono llamada entrante
Cómo reproducir el tono de llamada/alarma en Android (11)
He estado buscando en todas partes cómo reproducir un tono de llamada / 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 que esto funcione:
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();
}
Me sale este error:
04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn''t open fd for
content://settings/system/ringtone
Entonces ... por favor, si alguien sabe cómo tocar un tono de llamada / alarma predeterminado, hágamelo saber.
Prefiero no cargar ningún archivo. Simplemente reproduce un tono de llamada predeterminado.
Aquí hay un código de muestra:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
Copiar un archivo de audio a la tarjeta sd del emulador y seleccionarlo a través del reproductor multimedia como el tono de llamada predeterminado resuelve el problema.
Esta es la forma en que lo hice:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();
Es similar al modo de Markov00, 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 reproduciéndose en segundo plano.
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();
Para los futuros usuarios de google: use RingtoneManager.getActualDefaultRingtoneUri()
lugar de RingtoneManager.getDefaultUri()
. De acuerdo con su nombre, devolvería el uri real, por lo que puede usarlo libremente. De la documentación de getActualDefaultRingtoneUri()
:
Obtiene el Uri del sonido predeterminado actual. Esto dará el Uri de sonido real , en lugar de usar esto, la mayoría de los clientes pueden usar DEFAULT_RINGTONE_URI.
Mientras tanto getDefaultUri()
dice esto:
Devuelve el Uri para el tono de llamada predeterminado de un tipo en particular. En lugar de devolver el sonido real Uri, devolverá el Uri simbólico que se resolverá con el sonido real cuando se reproduzca.
Puede insertar un archivo MP3 en su carpeta / sdcard usando DDMS, reiniciar el emulador, abrir la aplicación Multimedia, buscar su archivo MP3, mantenerlo presionado y seleccionar "Utilizar como tono de llamada del teléfono".
¡El error desapareció!
Editar: el mismo problema con los sonidos de notificación (por ejemplo, para SMS) resuelto usando la aplicación RingDroid
Puede usar este código de muestra:
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)
if (ringtoneSound != null) {
ringtoneSound.play();
}
Si un usuario nunca ha configurado una alarma en su teléfono, TYPE_ALARM puede devolver nulo. Puedes contabilizar 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);
}
}
Simplemente puede reproducir un tono de llamada establecido con esto:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
Tu 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 el content://settings/system/ringtone
no se resuelve en nada reproducible. Funciona bien en mi teléfono real.
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);
}
}