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.