So spielen Sie Klingelton / Alarmton in Android ab


119

Ich habe überall gesucht, wie man einen Klingelton / Alarmton in Android abspielt.

Ich drücke eine Taste und möchte einen Klingelton / Alarmton abspielen. Ich konnte keine einfache und unkomplizierte Probe finden. Ja, ich habe mir bereits den Wecker-Quellcode angesehen ... aber es ist nicht einfach und ich kann ihn nicht kompilieren.

Ich kann diese Arbeit nicht machen:

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

Ich erhalte diesen Fehler:

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

Also .. bitte, wenn jemand weiß, wie man einen Standard-Klingelton / Alarm spielt, lass es mich wissen.

Ich ziehe es vor, keine Datei hochzuladen. Spielen Sie einfach einen Standardklingelton ab.

Antworten:


186

Sie können einfach einen festgelegten Klingelton damit spielen:

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

Ich erhalte immer noch eine Fehlermeldung - Klingeltoninhalt konnte nicht geöffnet werden: // settings / system / alarm_alert
— Pritesh Desai

3
Schön und einfach. Je nach Gerät kann diese Methode jedoch andere Sounds (wie Musik) unterbrechen, die möglicherweise in Android abgespielt werden.
— igordc

Die Verwendung von getApplicationContext () ist möglicherweise keine sehr gute Option. Weitere Infos hier: stackoverflow.com/questions/9122627/…
— Saket

@ BartSimpson, wie Sie das Problem gelöst haben Ich erhalte auch diesen Fehler
— user3233280

1
Klingelton kann nicht gestoppt werden. Wenn Sie den Klingelton erneut starten, wird doppelt abgespielt. stopPrevious funktioniert nicht, übrigens erstelle ich einen Klingelton-Player mit demselben Kontextobjekt, nicht mit getapplicationcontext.
— Metehan Toksoy

65

Wenn ein Benutzer noch nie einen Alarm auf seinem Telefon eingestellt hat, kann TYPE_ALARM null zurückgeben. Sie können dies erklären mit:

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
Der zurückgegebene URI ist möglicherweise nicht vorhanden, nullobwohl er nicht auf einen gültigen Sound verweist. Sie sollten den Rückgabewert von RingtoneManager.getRingtone()für nullstattdessen / auch
— Attila

Im Jahr 2017 funktioniert nicht klingeln. Funktioniert es in den letzten Android-Versionen?

55

So habe ich es gemacht:

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

Es ähnelt der Methode von markov00, verwendet jedoch MediaPlayer anstelle von Ringtone, wodurch verhindert wird, dass andere Sounds wie Musik unterbrochen werden, die möglicherweise bereits im Hintergrund abgespielt werden.


5
Ich habe die Top-Antwort (ringtone.play) ausprobiert, aber der Ton wird möglicherweise unterbrochen. Ich habe diesen Ansatz verwendet und es hat perfekt funktioniert.
— Wyz

1
Dies ist eine bessere Lösung für alle, die andere Audiokomponenten in ihrer App verwenden.
— EntangledLoops

@YumYumYum, ich habe gerade getestet und es funktioniert. Ich habe nichts anderes getan, als den obigen Code in meinen setOnClickListner einzufügen. Was hast du getan?
— Feature Himmel

17

Ihr Beispiel ist im Grunde das, was ich benutze. Es funktioniert jedoch nie auf dem Emulator, da der Emulator standardmäßig keine Klingeltöne hat und content://settings/system/ringtonesich nicht in etwas Spielbares auflöst. Es funktioniert gut auf meinem tatsächlichen Telefon.


11

Das funktioniert gut:

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
Warum teilen Sie das Volumen durch 7,0? Ist es ein allgemein bekannter Arbeitswert oder etwas, das Sie selbst ausgraben?
— ErGo_404

Etwas, das ich ausgegraben habe ...: D
— Kamran Ahmed

Warum machst du Float.parseFloat (Double.toString (....))? Eine String-Instanz durchlaufen, weil Sie eine Double-> Float-Konvertierung wünschen? Warum tust du das?
— Zordid

1
Dieser Teil ist redundant Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () gibt bereits eine URI zurück, es ist nicht erforderlich, sie noch in eine andere URI zu analysieren
— DritanX

1
7 ist eine maximale Lautstärke für den Stram
— Leo Droidcoder

11

Für die zukünftigen Googler: Verwenden Sie RingtoneManager.getActualDefaultRingtoneUri()anstelle von RingtoneManager.getDefaultUri(). Entsprechend seinem Namen würde es den tatsächlichen Uri zurückgeben, so dass Sie ihn frei verwenden können. Aus der Dokumentation von getActualDefaultRingtoneUri():

Ruft den Uri des aktuellen Standardtons ab. Dies gibt den tatsächlichen Sound Uri, anstatt diesen zu verwenden, können die meisten Clients DEFAULT_RINGTONE_URI verwenden.

In der Zwischenzeit getDefaultUri()sagt dies:

Gibt den Uri für den Standardklingelton eines bestimmten Typs zurück. Anstatt den Uri-Sound des eigentlichen Klingeltons zurückzugeben, wird der symbolische Uri zurückgegeben, der beim Abspielen in den tatsächlichen Sound aufgelöst wird.


9

Sie können eine MP3-Datei mit DDMS in Ihren Ordner / sdcard verschieben, den Emulator neu starten, dann die Medienanwendung öffnen, zu Ihrer MP3-Datei navigieren, lange darauf drücken und "Als Telefonklingelton verwenden" auswählen.

Fehler ist weg!

Bearbeiten: Das gleiche Problem mit Benachrichtigungstönen (z. B. für SMS) wurde mit der Ringdroid-Anwendung behoben


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

woher AlarmServicekommen aus?
— Eduardo Wada

2

Das Kopieren einer Audiodatei auf die SD-Karte des Emulators und das Auswählen über den Media Player als Standardklingelton löst das Problem tatsächlich.


2

Sie können diesen Beispielcode verwenden:

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

if (ringtoneSound != null) {
    ringtoneSound.play();
}

-4

Hier ist ein Beispielcode:

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

Erklären Sie den Code mit einer kleinen Erklärung. Nur Code-Antworten werden nicht geschätzt.
— Sulthan Allaudeen

Komm schon Mann, du hast die obigen Antworten wahrscheinlich nie gelesen. stackoverflow.com/a/20177743/3332634
— yshahak

1
Dies ist grundsätzlich identisch mit dieser Antwort , jedoch mit dem Variablennamen mediaPlayeranstelle von mp.
— Makyen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.