J'ai cherché partout comment jouer une sonnerie/alarme dans Android.
J'appuie sur un bouton et je veux jouer une sonnerie/sonnerie d'alarme. Je ne pouvais pas trouver un échantillon simple et direct. Oui, j'ai déjà regardé le code source de Alarm clock ... mais ce n'est pas simple et je ne peux pas le compiler.
Je ne peux pas faire ce travail:
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();
}
Je reçois cette erreur:
04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for
content://settings/system/ringtone
Alors .. s'il vous plaît si quelqu'un sait comment jouer une sonnerie/alarme par défaut faites le moi savoir.
Je préfère ne télécharger aucun fichier. Il suffit de jouer une sonnerie par défaut.
Vous pouvez simplement jouer une sonnerie définie avec ceci:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
Si un utilisateur n'a jamais défini d'alarme sur son téléphone, le TYPE_ALARM peut renvoyer la valeur null. Vous pouvez en rendre compte avec:
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);
}
}
C'est comme ça que j'ai fait:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();
Il ressemble à Markov00, mais utilise MediaPlayer à la place de Ringtone, qui empêche d’interrompre d’autres sons, tels que la musique, qui sont peut-être déjà lus en arrière-plan.
Votre exemple est fondamentalement ce que j'utilise. Toutefois, cela ne fonctionne jamais sur l'émulateur, car celui-ci ne possède pas de sonneries par défaut et content://settings/system/ringtone
ne résout rien. Cela fonctionne bien sur mon téléphone actuel.
Cela fonctionne 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();
Vous pouvez importer un fichier MP3 dans votre dossier/sdcard à l'aide de DDMS, redémarrer l'émulateur, ouvrir l'application Multimédia, rechercher votre fichier MP3, appuyer longuement dessus et sélectionner "Utiliser comme sonnerie du téléphone".
L'erreur est partie!
Éditer: même problème avec les sons de notification (par exemple pour les SMS) résolu avec l’application Ringdroid
Pour les futurs googlers: utilisez RingtoneManager.getActualDefaultRingtoneUri()
au lieu de RingtoneManager.getDefaultUri()
. Selon son nom, il renverrait l'URI réel, vous pouvez donc l'utiliser librement. De la documentation de getActualDefaultRingtoneUri()
:
Obtient l'Uri du son par défaut actuel. Cela donnera le réel son Uri, au lieu de l'utiliser, la plupart des clients peuvent utiliser DEFAULT_RINGTONE_URI.
Pendant ce temps getDefaultUri()
dit ceci:
Renvoie l'URI de la sonnerie par défaut d'un type particulier. Plutôt que de renvoyer le son Uri de la sonnerie réelle, ceci renverra le symbolique Uri qui sera résolu en son réel une fois joué.
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);
}
}
Vous pouvez utiliser cet exemple de code:
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)
if (ringtoneSound != null) {
ringtoneSound.play();
}
Copier un fichier audio sur la carte SD de l'émulateur et le sélectionner via le lecteur multimédia comme sonnerie par défaut résout effectivement le problème.