Jak odtworzyć dźwięk dzwonka / alarmu w systemie Android

119

Szukałem wszędzie, jak odtworzyć dźwięk dzwonka / alarmu w Androidzie.

Naciskam przycisk i chcę odtworzyć dzwonek / dźwięk alarmu. Nie mogłem znaleźć łatwej, prostej próbki. Tak, sprawdziłem już kod źródłowy budzika ... ale nie jest to proste i nie mogę go skompilować.

Nie mogę tego zrobić:

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

Otrzymuję ten błąd:

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

Więc .. proszę, jeśli ktoś wie, jak odtworzyć domyślny dzwonek / alarm, daj mi znać.

Wolę nie przesyłać żadnych plików. Po prostu odtwórz domyślny dzwonek.

Federico
źródło

Odpowiedzi:

186

Możesz po prostu odtworzyć ustawiony dzwonek za pomocą tego:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
markov00
źródło
Nadal pojawia się błąd - Nie udało się otworzyć zawartości dzwonka: // settings / system / alarm_alert
Pritesh Desai
3
Ładnie i prosto. Jednak w zależności od urządzenia ta metoda może zakłócać inne dźwięki (takie jak muzyka), które mogą być odtwarzane w systemie Android.
igordc
Użycie metody getApplicationContext () może nie być zbyt dobrą opcją. Więcej informacji tutaj: stackoverflow.com/questions/9122627/…
Saket
@BartSimpson jak rozwiązano problem, otrzymuję również ten błąd
user3233280
1
Nie można zatrzymać dzwonka. Jeśli ponownie zaczniesz dzwonek, odtwarza podwójnie. stopPoprzednia nie działa, przy okazji tworzę odtwarzacz dzwonków z tym samym obiektem kontekstu, a nie getapplicationcontext.
Metehan Toksoy
65

Jeśli użytkownik nigdy nie ustawił alarmu w swoim telefonie, TYPE_ALARM może zwrócić wartość null. Możesz to wyjaśnić:

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
źródło
1
Zwrócony identyfikator URI może nie być, nullnawet jeśli nie wskazuje prawidłowego dźwięku. Powinieneś przetestować zwracaną wartość RingtoneManager.getRingtone()for nullzamiast / również
Attila,
W 2017 roku nie działa, nie dzwoni. Czy to działa w najnowszym systemie Android?
55

Oto sposób, w jaki zrobiłem:

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

Jest podobny do sposobu markov00, ale używa MediaPlayer zamiast Ringtone, który zapobiega zakłócaniu innych dźwięków, takich jak muzyka, która może już być odtwarzana w tle.

igordc
źródło
5
Wypróbowałem górną odpowiedź (ringtone.play), ale dźwięk może zostać odcięty. Użyłem tego podejścia i zadziałało idealnie.
wyz
1
To lepsze rozwiązanie dla każdego, kto korzysta z innych komponentów audio w swojej aplikacji.
EntangledLoops
@YumYumYum, właśnie przetestowałem i działa. Nie zrobiłem nic, tylko umieściłem powyższy kod w moim setOnClickListner. Co zrobiłeś?
niebo fabularne
17

Twój przykład jest w zasadzie tym, czego używam. Jednak nigdy nie działa na emulatorze, ponieważ emulator domyślnie nie ma żadnych dzwonków i content://settings/system/ringtonenie rozwiązuje się na nic, co można odtworzyć. Działa dobrze na moim telefonie.

synic
źródło
11

To działa dobrze:

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
źródło
2
Dlaczego dzielisz objętość przez 7,0? Czy jest to powszechnie znana wartość robocza czy coś, co sam wykopujesz?
ErGo_404
Coś, co wykopałem ...: D
Kamran Ahmed
Dlaczego robisz Float.parseFloat (Double.toString (....)) ?? Przechodzisz przez instancję typu String, ponieważ chcesz wykonać konwersję double-> float? Czemu to robisz?
Zordid
1
Ta część jest redundantna Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () zwraca już URI, nie ma potrzeby parsowania go jeszcze do innego URI
DritanX
1
7 to maksymalna głośność dla
stramu
11

Dla przyszłych pracowników Google: użyj RingtoneManager.getActualDefaultRingtoneUri()zamiast RingtoneManager.getDefaultUri(). Zgodnie z nazwą zwróciłby on rzeczywisty uri, więc możesz go swobodnie używać. Z dokumentacji getActualDefaultRingtoneUri():

Pobiera Uri bieżącego domyślnego dźwięku. To da rzeczywisty dźwięk Uri, zamiast go używać, większość klientów może używać DEFAULT_RINGTONE_URI.

Tymczasem getDefaultUri()mówi tak:

Zwraca Uri dla domyślnego dzwonka określonego typu. Zamiast zwracać Uri rzeczywistego dźwięku dzwonka, zwróci to symboliczny Uri, który po odtworzeniu zostanie zastąpiony rzeczywistym dźwiękiem.

Matvey Rybakov
źródło
9

Możesz przesłać plik MP3 do folderu / sdcard za pomocą DDMS, ponownie uruchomić emulator, a następnie otworzyć aplikację Media, przejść do pliku MP3, przytrzymać go i wybrać opcję „Użyj jako dzwonka telefonu”.

Błąd zniknął!

Edycja: ten sam problem z dźwiękami powiadomień (np. SMS) rozwiązany za pomocą aplikacji Ringdroid

OcuS
źródło
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 słoneczny
źródło
skąd AlarmServicepochodzi?
Eduardo Wada
2

Skopiowanie pliku audio na kartę SD emulatora i wybranie go przez odtwarzacz multimediów jako domyślny dzwonek rzeczywiście rozwiązuje problem.

Valentin Klinghammer
źródło
2

Możesz użyć tego przykładowego kodu:

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

if (ringtoneSound != null) {
    ringtoneSound.play();
}
Gio MV
źródło
0

Może być późno, ale jest nowe, proste rozwiązanie tego pytania dla każdego, kto kiedykolwiek tego chce.
W Kotlin

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

Powyższy kod odtworzy domyślny dzwonek, ale jeśli chcesz domyślny alarm, zmień

Settings.System.DEFAULT_RINGTONE_URI

do

Ustawienia.System.DEFAULT_ALARM_ALERT_URI

Reza
źródło
-4

Oto przykładowy kod:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
Nishant
źródło
Wyjaśnij kod z małym wyjaśnieniem, odpowiedzi zawierające tylko kod nie są mile widziane.
Sulthan Allaudeen
No dalej stary, prawdopodobnie nigdy nie czytałeś powyższych odpowiedzi. stackoverflow.com/a/20177743/3332634
yshahak
1
Jest to w zasadzie identyczne z tą odpowiedzią , ale z nazwą zmiennej mediaPlayerzamiast mp.
Makyen