Android'de zil sesi / alarm sesi nasıl oynanır


119

Android'de zil sesi / alarm sesini nasıl çalacağımı her yerde arıyordum.

Bir düğmeye basıyorum ve bir zil sesi / alarm sesi çalmak istiyorum. Kolay ve anlaşılır bir örnek bulamadım. Evet, Alarm saat kaynak koduna zaten baktım ... ama bu basit değil ve derleyemiyorum.

Bunun çalışmasını sağlayamam:

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

Bu hatayı alıyorum:

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

Öyleyse .. lütfen biri varsayılan zil sesini / alarmı nasıl çalacağını biliyorsa bana bildirin.

Herhangi bir dosya yüklememeyi tercih ederim. Varsayılan bir zil sesini çalmanız yeterlidir.

Yanıtlar:


186

Bununla basitçe ayarlanmış bir zil sesi çalabilirsiniz:

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

Hâlâ bir hata alıyorum - Zil sesi içeriği açılamadı: // settings / system / alarm_alert
— Pritesh Desai

3
Güzel ve basit. Ancak, cihaza bağlı olarak, bu yöntem Android'de çalan diğer sesleri (müzik gibi) kesebilir.
— igordc

GetApplicationContext () kullanmak çok iyi bir seçenek olmayabilir. Daha fazla bilgi burada: stackoverflow.com/questions/9122627/…
— Saket

@BartSimpson sorunu nasıl çözdüğünüzü de bu hatayı alıyorum
— user3233280

1
Zil sesi durdurulamaz. Zil sesini yeniden başlatırsanız, iki kez çalar. stopPrevious çalışmıyor, bu arada getapplicationcontext ile değil aynı bağlam nesnesiyle zil sesi çalar oluşturuyorum.
— Metehan Toksoy

65

Bir kullanıcı telefonunda hiç alarm ayarlamadıysa, TYPE_ALARM null döndürebilir. Bunu şu şekilde açıklayabilirsiniz:

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
Döndürülen URI null, geçerli bir sese işaret etmese bile olmayabilir . Sen dönüş değeri test etmelidir RingtoneManager.getRingtone()için nullas-de / yerine
— Attila

2017'de çalmayı başaramıyorum. Son Android'de çalışıyor mu?

55

Ben böyle yaptım:

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

Markov00'ün yöntemine benzer, ancak Zil Sesi yerine MediaPlayer'ı kullanır; bu, müzik gibi, zaten arka planda çalmakta olan diğer seslerin kesilmesini önler.


5
En iyi yanıtı denedim (ringtone.play) ancak ses kesilebilir. Bu yaklaşımı kullandım ve mükemmel çalıştı.
— wyz

1
Bu, uygulamalarında diğer ses bileşenlerini kullanan herkes için daha iyi bir çözümdür.
— EntangledLoops

@YumYumYum, sadece test ettim ve işe yarıyor. Yukarıdaki kodu setOnClickListner'ıma koymaktan başka bir şey yapmadım. Ne yaptın?
— öne çıkan gökyüzü

17

Örneğiniz temelde kullandığım şey. Öykünücü üzerinde asla çalışmaz, çünkü öykünücü varsayılan olarak herhangi bir zil sesine content://settings/system/ringtonesahip değildir ve oynatılabilir hiçbir şeyi çözmez. Gerçek telefonumda iyi çalışıyor.


11

Bu iyi çalışıyor:

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
Neden hacmi 7.0'a bölüyorsunuz? Yaygın olarak bilinen bir çalışma değeri mi yoksa kendi kendinize kazandığınız bir şey mi?
— ErGo_404

Çıkardığım bir şey ...: D
— Kamran Ahmed

Neden Float.parseFloat (Double.toString (....)) yapıyorsunuz? Double-> float dönüşümü istediğiniz için String örneğinden mi geçiyorsunuz? Neden bunu yapıyorsun?
— Zordid

1
Bu kısım gereksiz Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () zaten bir URI döndürüyor, onu başka bir
— URI'ye

1
7 oyun için maksimum hacim
— Leo Droidcoder

11

Gelecekteki Google çalışanları için: RingtoneManager.getActualDefaultRingtoneUri()yerine kullanın RingtoneManager.getDefaultUri(). İsmine göre, gerçek uri'yi döndürür, böylece özgürce kullanabilirsiniz. Belgelerden getActualDefaultRingtoneUri():

Geçerli varsayılan sesin Uri değerini alır. Bu, gerçek URI sesini verecektir, bunu kullanmak yerine çoğu istemci DEFAULT_RINGTONE_URI kullanabilir.

Bu arada şunu getDefaultUri()söylüyor:

Belirli bir türün varsayılan zil sesi için URI döndürür. Gerçek zil sesinin Uri sesini geri döndürmek yerine, bu, çalındığında gerçek sese dönüşecek olan sembolik Uri'yi döndürecektir .


9

DDMS kullanarak / sdcard klasörünüzdeki bir MP3 dosyasını itebilir, emülatörü yeniden başlatabilir, ardından Medya uygulamasını açabilir, MP3 dosyanıza göz atabilir, üzerine uzun süre basıp "Telefon zil sesi olarak kullan" ı seçebilirsiniz.

Hata gitti!

Düzenleme: Ringdroid uygulaması kullanılarak çözülen bildirim sesleriyle aynı sorun (örneğin SMS için)


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

nereden AlarmServicegeliyor
— Eduardo Wada

2

Bir ses dosyasını öykünücünün sd kartına kopyalamak ve bunu medya oynatıcı aracılığıyla varsayılan zil sesi olarak seçmek sorunu gerçekten çözmektedir.


2

Bu örnek kodu kullanabilirsiniz:

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

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

0

Geç olabilir ama kim isterse bu soruya yeni ve basit bir çözüm var.
Kotlin bölgesinde

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

Yukarıdaki kod varsayılan zil sesini çalacaktır, ancak varsayılan alarm istiyorsanız

Settings.System.DEFAULT_RINGTONE_URI

için

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

İşte bazı örnek kodlar:

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

Kodu küçük bir açıklama ile açıklayın, Kod sadece cevapları takdir edilmemiştir.
— Sulthan Allaudeen

Hadi dostum, muhtemelen yukarıdaki cevapları hiç okumadın. stackoverflow.com/a/20177743/3332634
— yshahak

1
Bu temelde bu cevapla aynıdır , ancak mediaPlayeryerine değişken adı ile mp.
— Makyen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.