Comment jouer la sonnerie / le son d'alarme sous Android

119

J'ai cherché partout comment jouer une sonnerie / un son d'alarme dans Android.

J'appuie sur un bouton et je veux jouer une sonnerie / un son d'alarme. Je n'ai pas pu trouver un échantillon simple et direct. Oui, j'ai déjà regardé le code source du réveil ... 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();
}

J'obtiens 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. Jouez simplement une sonnerie par défaut.

Federico
la source

Réponses:

186

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();
markov00
la source
Je reçois toujours une erreur - Impossible d'ouvrir le contenu de la sonnerie: // settings / system / alarm_alert
Pritesh Desai
3
Sympa et simple. Cependant, en fonction de l'appareil, cette méthode peut interrompre d'autres sons (comme la musique) qui pourraient être lus sous Android.
igordc
L'utilisation de getApplicationContext () n'est peut-être pas une très bonne option. Plus d'infos ici: stackoverflow.com/questions/9122627/…
Saket
@BartSimpson comment vous avez résolu le problème, je reçois également cette erreur
user3233280
1
La sonnerie ne peut pas être arrêtée. Si la sonnerie recommence, joue en double. stopPrevious ne fonctionne pas, d'ailleurs je crée un lecteur de sonnerie avec le même objet de contexte, pas getapplicationcontext.
Metehan Toksoy
65

Si un utilisateur n'a jamais défini d'alarme sur son téléphone, TYPE_ALARM peut renvoyer 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);                
    }
}
Blundell
la source
1
L'URI renvoyé peut ne pas l'être nullmême s'il ne pointe pas vers un son valide. Vous devriez tester la valeur de retour de RingtoneManager.getRingtone()for à la nullplace / aussi bien
Attila
En 2017, ne fonctionnait pas à défaut de sonner. Cela fonctionne-t-il dans Android récent?
55

C'est comme ça que j'ai fait:

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

Il est similaire à la manière de markov00, mais utilise MediaPlayer au lieu de Ringtone qui empêche d'interrompre d'autres sons, comme la musique, qui pourraient déjà être lus en arrière-plan.

igordc
la source
5
J'ai essayé la réponse supérieure (ringtone.play) mais le son peut être coupé. J'ai utilisé cette approche et cela a parfaitement fonctionné.
wyz
1
C'est une meilleure solution pour toute personne utilisant d'autres composants audio dans son application.
EntangledLoops
@YumYumYum, je viens de tester et ça marche. Je n'ai rien fait d'autre que mettre le code ci-dessus dans mon setOnClickListner. Qu'est-ce que tu as fait?
Feature sky
17

Votre exemple est essentiellement ce que j'utilise. Cela ne fonctionne jamais sur l'émulateur, cependant, car l'émulateur n'a pas de sonneries par défaut et content://settings/system/ringtonene résout rien de jouable. Cela fonctionne bien sur mon téléphone réel.

synique
la source
11

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();
Kamran Ahmed
la source
2
Pourquoi divisez-vous le volume par 7,0? Est-ce une valeur de travail communément connue ou quelque chose que vous déterrez vous-même?
ErGo_404
Quelque chose que j'ai creusé ...: D
Kamran Ahmed
Pourquoi faites-vous Float.parseFloat (Double.toString (....)) ?? Vous passez par une instance String parce que vous voulez une conversion double-> float? Pourquoi fais-tu cela?
Zordid
1
Cette partie est redondante Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () renvoie déjà un URI, pas besoin de l'analyser encore dans un autre URI
DritanX
1
7 est un volume maximum pour le stram
Leo Droidcoder
11

Pour les futurs googleurs: utilisez RingtoneManager.getActualDefaultRingtoneUri()plutôt que 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 véritable Uri du son, au lieu de l'utiliser, la plupart des clients peuvent utiliser DEFAULT_RINGTONE_URI.

Pendant getDefaultUri()ce temps dit ceci:

Renvoie l'URI de la sonnerie par défaut d'un type particulier. Plutôt que de renvoyer l'Uri du son de la sonnerie, cela renverra l' URI symbolique qui sera résolu en son réel lors de la lecture.

Matvey Rybakov
la source
9

Vous pouvez pousser un fichier MP3 dans votre dossier / sdcard en utilisant DDMS, redémarrer l'émulateur, puis ouvrir l'application Média, parcourir votre fichier MP3, appuyer longuement dessus et sélectionner "Utiliser comme sonnerie de téléphone".

L'erreur est partie!

Edit: même problème avec les sons de notification (par exemple pour les SMS) résolus à l'aide de l'application Ringdroid

OcuS
la source
4
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);
    }
}
Kumar ensoleillé
la source
d'où AlarmServicevient-il?
Eduardo Wada le
2

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 en effet le problème.

Valentin Klinghammer
la source
2

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();
}
Gio MV
la source
0

Il est peut-être tard mais il existe une nouvelle solution simple à cette question pour qui en a envie.
À Kotlin

val player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI)
player.start()

Le code ci-dessus jouera la sonnerie par défaut, mais si vous voulez une alarme par défaut, changez

Settings.System.DEFAULT_RINGTONE_URI

à

Settings.System.DEFAULT_ALARM_ALERT_URI

Reza
la source
-4

Voici un exemple de code:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
Nishant
la source
Expliquez le code avec un peu d'explication, les réponses au code uniquement ne sont pas appréciées.
Sulthan Allaudeen
Allez mec, tu n'as probablement jamais lu les réponses ci-dessus. stackoverflow.com/a/20177743/3332634
yshahak
1
C'est fondamentalement identique à cette réponse , mais avec le nom de la variable mediaPlayerau lieu de mp.
Makyen