web-dev-qa-db-fra.com

Comment jouer à la sonnerie / alarme dans Android

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.

112
Federico

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();
174
markov00

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);                
    }
}
63
Blundell

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.

52
igordc

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.

17
synic

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();
10
Kamran Ahmed

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

9
OcuS

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

9
Matvey Rybakov
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);
    }
}
3
Kumar sunny

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();
}
2
Gio MV

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.

2