Android bildirim sesi nasıl çalınır


169

Medya sesini duymadan bir bildirim sesini nasıl çalabileceğimi merak ediyordum. Şu anda bunu medya oynatıcı üzerinden yapabilirim, ancak medya dosyası olarak oynatılmasını istemiyorum, bildirim, uyarı veya zil sesi olarak oynatılmasını istiyorum. heres benim kod şu anda nasıl bir örnek:

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

Yanıtlar:


421

Birisi hala buna bir çözüm arıyorsa , Android'de zil sesi / alarm sesi nasıl çalınır

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

TYPE_NOTIFICATION öğesini TYPE_ALARM olarak değiştirebilirsiniz, ancak çalmayı durdurmak için Ringtone r'nizi takip etmek isteyeceksiniz ... örneğin, kullanıcı bir düğmeyi veya başka bir şeyi tıkladığında.


2
Örneğin Motorola telefonları tercihler etkinliğini uzattı ve kullanıcının sms ve diğer kategoriler için bir bildirim sesi tanımlamasına izin verdi. Yukarıdaki yöntem bu tür telefonlarla çalışmaz. Bu sorunun nasıl çözüleceği hakkında bir fikriniz var mı?
David

2
Bunun bir hata var: MediaPlayer - Should have subtitle controller already set. Bu ne demek?
Deqing

Bu çözümü kullanarak, 28/29 kez sonra sesler çalmayı durdurur. Nedenini bilen var mı?
Tom Brinkkemper

1
Neden her istisnayı yakaladın? Hangisi atılabilir?
Miha_x64

2
@ Sam, Evet. Genel olarak , her oynattığınızda bir RingTone nesnesi oluşturmayın. Bir kez oluşturun ve aynı nesneyi birden çok kez oynatın.
Tom Brinkkemper

205

Bunu, sesi ayrı olarak çağırmak yerine bildirim oluştururken sesi ekleyerek yapabilirsiniz.

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

12
Bu farklı bir sorunu çözer - "bildirim sesi nasıl çalınır" değil, "bildirim nasıl çalınır ve ses gösterilir". Kabul edilen cevap çözümünde haklı.
Fabian Tamp

7
Belki de bunu STREAM_NOTIFICATION üzerinden oynayacak şekilde ayarlamanız gerekir, böylece işletim sistemi geçerli bildirim hacmi tercihiyle oynatılır: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle İyi çalışıyor. ancak birden fazla bildirim durumunda, örneğin 100 bildirim paralelinde ses, bir sonraki bildirim sesiyle karıştırılır. mantıksal olarak ses çalınıyorsa, önceki çalmanın tamamlanmasını beklemelidir. Lütfen bu senaryoda yardımcı olabilir misiniz?
Waqas Ali Razzaq

uygulama arka planda olduğunda ses çalmıyor. herhangi bir öneri?
Sagar Nayak

47

Varsayılan bir bildirim sesinin çalınmasını istiyorsanız, setDefaults (int)NotificationCompat.Builder sınıf yöntemini kullanabilirsiniz :

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

Görevinizi gerçekleştirmenin en kolay yolunun bu olduğuna inanıyorum.


uygulama arka planda olduğunda ses çalmıyor. herhangi bir öneri?
Sagar Nayak

13

Bunu dene:

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

9

Sorunuzdan bu yana bir süre geçti, ama ... Ses akışı türünü ayarlamayı denediniz mi?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Hazırlanmadan önce yapılmalıdır.


2

Hemen hemen aynı soruya sahiptim. Bazı araştırmalardan sonra, varsayılan sistem "bildirim sesini" çalmak istiyorsanız, hemen hemen bir bildirim görüntülemeniz ve varsayılan sesi kullanmasını söylemeniz gerektiğini düşünüyorum. Ve diğer bazı cevaplarda argüman için söylenecek bir şey var, eğer bir bildirim sesi çalıyorsanız, aynı zamanda bir bildirim mesajı da sunmalısınız.

Ancak, bildirim API'sinde küçük bir değişiklik ve istediğiniz şeye yaklaşabilirsiniz. Boş bir bildirim görüntüleyebilir ve birkaç saniye sonra otomatik olarak kaldırabilirsiniz. Bunun benim için işe yarayacağını düşünüyorum; belki işinize yarayacaktır.

com.globalmentor.android.app.Notifications.javaBöyle bir bildirim sesi oluşturmanıza izin veren bir dizi kolaylık yöntemi oluşturdum:

Notifications.notify(this);

Ayrıca LED yanıp söner ve titreşim izniniz varsa bir titreşim oluşur. Evet, bildirim çubuğunda bir bildirim simgesi görünecek, ancak birkaç saniye sonra kaybolacaktır.

Bu noktada, bildirim yine de kaldırılacağından, bildirim çubuğunda kayan bir ticker mesajınız olabileceğini fark edebilirsiniz; bunu şöyle yapabilirsiniz:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

Bu sınıfta başka birçok kolaylık yöntemi vardır. Tüm kütüphaneyi Subversion deposundan indirebilir ve Maven ile oluşturabilirsiniz. Maven ile de kurulabilen ve kurulabilen globalmentor-core kütüphanesine bağlıdır.


Bu sadece bir ses çalmak için karmaşık bir yol. Bunu sadece yapabilirsiniz: stackoverflow.com/a/9622040/1417267
slinden77


1

"Bildirim sesi" kavramının Android kullanıcı arayüzü için yanlış olduğunu düşünüyorum.

Android'in beklenen davranışı kullanıcıyı uyarmak için standart Bildirimi kullanmaktır. Durum çubuğu simgesi olmadan bir bildirim sesi çalarsanız, kullanıcının kafasını karıştırırsınız ("bu ses neydi? Burada simge yok, belki de işitme sorunlarım var?").

Bir bildirimde ses ayarı nasıl yapılır örneğin: Bildirim için ses ayarlama


1
Pek değil, bu bir uygulama içi bildirim olabilir. Örneğin bir sohbet uygulamasındaysanız ve gelen ve giden mesajlar için küçük ses efektleriniz varsa. Bunlar özünde bildirimlerdir ve telefon sessiz moddayken kapanmalarını istersiniz.
copolii

Haklısın ama bu başka bir şey. Ben sistem Android GUI olan "sistem bildirim sesleri", (bu sorunun konusu olduğunu varsayarak) konuşuyordu. Tabii ki, kendi uygulamanıza girdiğinizde, hepsi size kalmış.
think01

1
Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

1
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
NOhs

0

Sesi bildirim kanalına ayarla

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);
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.