Cara memainkan suara notifikasi android


169

Saya bertanya-tanya bagaimana saya bisa memutar suara notifikasi tanpa memutarnya di media streaming. Saat ini saya dapat melakukan ini melalui pemutar media, namun saya tidak ingin itu diputar sebagai file media, saya ingin itu diputar sebagai pemberitahuan atau peringatan atau nada dering. Inilah contoh kode saya sekarang:

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

Jawaban:


421

Jika ada yang masih mencari solusi untuk ini, saya menemukan jawaban di Cara memainkan nada dering / alarm di Android

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

Anda dapat mengubah TYPE_NOTIFICATION menjadi TYPE_ALARM, tetapi Anda ingin tetap melacak nada dering Anda untuk berhenti memainkannya ... katakanlah, ketika pengguna mengklik tombol atau sesuatu.


2
Ponsel Motorola misalnya memperluas aktivitas preferensi dan memungkinkan pengguna untuk menentukan suara notifikasi untuk sms dan kategori lainnya. Metode di atas tidak akan berfungsi dengan ponsel jenis ini. Apakah Anda tahu cara mengatasi masalah ini?
David

2
Aku punya kesalahan dengan ini: MediaPlayer - Should have subtitle controller already set. Apa artinya?
Deqing

Menggunakan solusi ini, setelah 28/29 kali, suara berhenti diputar. Adakah yang tahu kenapa?
Tom Brinkkemper

1
Mengapa Anda menangkap setiap pengecualian? Yang mana yang bisa dilempar?
Miha_x64

2
@ Sam, Ya. stackoverflow.com/q/39876885/2614353.Pada dasarnya , jangan membuat objek RingTone setiap kali Anda memainkannya. Buat sekali, lalu mainkan objek yang sama beberapa kali.
Tom Brinkkemper

205

Anda sekarang dapat melakukan ini dengan memasukkan suara saat membuat notifikasi daripada memanggil suara secara terpisah.

//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
Ini memecahkan masalah yang berbeda - bukan "cara memainkan suara notifikasi", tetapi "bagaimana memainkan notifikasi dan menampilkan suara". Jawaban yang diterima dibenarkan dalam solusinya.
Fabian Tamp

7
Mungkin Anda juga harus mengatur ini untuk diputar melalui STREAM_NOTIFICATION sehingga dimainkan dengan preferensi volume pemberitahuan OS saat ini: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle Ini berfungsi dengan baik. tetapi dalam hal beberapa notifikasi misalnya 100 notifikasi paralel suara dicampur dengan suara notifikasi selanjutnya. Logikanya jika suara sudah diputar itu harus menunggu penyelesaian dari bermain sebelumnya. Bisakah Anda membantu dalam skenario ini?
Waqas Ali Razzaq

tidak memutar suara saat aplikasi di latar belakang. ada saran?
Sagar Nayak

47

Jika Anda ingin suara notifikasi standar dimainkan, maka Anda dapat menggunakan metode setDefaults (int)NotificationCompat.Builder kelas:

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

Saya percaya itu cara termudah untuk menyelesaikan tugas Anda.


tidak memutar suara saat aplikasi di latar belakang. ada saran?
Sagar Nayak

13

Coba ini:

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

Sudah lama sejak pertanyaan Anda, tapi ... Apakah Anda sudah mencoba mengatur jenis aliran Audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Itu harus dilakukan sebelum mempersiapkan.


2

Saya punya pertanyaan yang hampir sama. Setelah beberapa penelitian, saya berpikir bahwa jika Anda ingin memutar sistem default "notifikasi suara", Anda cukup banyak harus menampilkan notifikasi dan katakan untuk menggunakan suara default. Dan ada sesuatu yang bisa dikatakan untuk argumen dalam beberapa jawaban lain bahwa jika Anda memainkan suara notifikasi, Anda harus menyajikan beberapa pesan notifikasi juga.

Namun, sedikit penyesuaian API notifikasi dan Anda bisa mendekati apa yang Anda inginkan. Anda dapat menampilkan notifikasi kosong dan kemudian menghapusnya secara otomatis setelah beberapa detik. Saya pikir ini akan bekerja untuk saya; mungkin itu akan berhasil untuk Anda.

Saya telah membuat serangkaian metode kenyamanan com.globalmentor.android.app.Notifications.javayang memungkinkan Anda membuat suara notifikasi seperti ini:

Notifications.notify(this);

LED juga akan berkedip dan, jika Anda memiliki izin getar, getaran akan terjadi. Ya, ikon notifikasi akan muncul di bilah notifikasi tetapi akan menghilang setelah beberapa detik.

Pada titik ini Anda mungkin menyadari bahwa, karena notifikasi akan hilang, Anda mungkin juga memiliki pesan ticker bergulir di bar notifikasi; Anda dapat melakukannya seperti ini:

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

Ada banyak metode kenyamanan lain di kelas ini. Anda dapat mengunduh seluruh perpustakaan dari repositori Subversinya dan membangunnya dengan Maven. Itu tergantung pada pustaka globalmentor-core, yang juga dapat dibangun dan diinstal dengan Maven.


Itu cara yang rumit untuk sekadar memainkan suara. Anda bisa melakukan ini: stackoverflow.com/a/9622040/1417267
slinden77


1

Saya pikir konsep "notifikasi suara" agak salah untuk UI Android.

Perilaku yang diharapkan Android adalah menggunakan Pemberitahuan standar untuk mengingatkan pengguna. Jika Anda memutar suara notifikasi tanpa ikon bilah status, Anda membuat pengguna bingung ("suara apa itu? Tidak ada ikon di sini, mungkin saya memiliki masalah pendengaran?").

Cara mengatur suara pada notifikasi, misalnya, di sini: Mengatur suara untuk notifikasi


1
Tidak juga, ini mungkin notifikasi dalam aplikasi. Misalnya jika Anda menggunakan aplikasi obrolan dan memiliki efek suara kecil untuk pesan masuk dan keluar. Itu pada dasarnya adalah notifikasi dan Anda ingin mereka tutup mulut ketika ponsel dalam mode diam.
copolii

Ya, Anda benar tetapi itu hal lain. Saya sedang berbicara (dengan asumsi ini adalah topik pertanyaan) dari "notifikasi sistem suara", yaitu pada sistem Android GUI. Tentu saja, ketika Anda masuk ke aplikasi Anda sendiri, semuanya terserah Anda.
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
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Nih

0

Setel suara ke saluran notifikasi

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

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

        channel.setSound(alarmUri, attributes);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.