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.

Federico
quelle

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();
markov00
quelle
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);                
    }
}
Blundell
quelle
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.

igordc
quelle
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.

synic
quelle
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();
Kamran Ahmed
quelle
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.

Matvey Rybakov
quelle
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

OcuS
quelle
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 sonnig
quelle
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.

Valentin Klinghammer
quelle
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();
}
Gio MV
quelle
-4

Hier ist ein Beispielcode:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
Nishant
quelle
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