วิธีเล่นเสียงแจ้งเตือน android


169

ฉันสงสัยว่าฉันจะเล่นเสียงการแจ้งเตือนได้อย่างไรโดยไม่ต้องเล่นผ่านสตรีมสื่อ ตอนนี้ฉันสามารถทำได้ผ่านเครื่องเล่นสื่อ แต่ฉันไม่ต้องการให้เล่นเป็นไฟล์สื่อฉันต้องการให้เล่นเป็นการแจ้งเตือนหรือแจ้งเตือนหรือเสียงเรียกเข้า นี่คือตัวอย่างของรหัสของฉันที่ดูเหมือนตอนนี้:

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

คำตอบ:


421

หากใครยังคงมองหาวิธีการแก้ปัญหานี้ฉันพบคำตอบที่วิธีเล่นเสียงเรียกเข้า / เสียงปลุกใน Android

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

คุณสามารถเปลี่ยน TYPE_NOTIFICATION เป็น TYPE_ALARM แต่คุณต้องการติดตามริงโทนของคุณเพื่อหยุดเล่น ... พูดเมื่อผู้ใช้คลิกปุ่มหรืออะไรบางอย่าง


2
เช่นโทรศัพท์โมโตโรล่าขยายกิจกรรมการตั้งค่าและช่วยให้ผู้ใช้สามารถกำหนดเสียงแจ้งเตือนสำหรับ SMS และหมวดหมู่อื่น ๆ วิธีการข้างต้นจะไม่สามารถใช้ได้กับโทรศัพท์ประเภทนี้ คุณมีความคิดวิธีแก้ปัญหานี้หรือไม่?
David

2
MediaPlayer - Should have subtitle controller already setผมได้รับข้อผิดพลาดกับเรื่องนี้: มันหมายความว่าอะไร?
Deqing

ใช้วิธีนี้หลังจาก 28/29 ครั้งเสียงจะหยุดเล่น ใครรู้ว่าทำไม
Tom Brinkkemper

1
ทำไมคุณถึงจับทุกข้อยกเว้น? อันไหนที่อาจถูกโยน?
Miha_x64

2
@Sam ใช่ stackoverflow.com/q/39876885/2614353โดยพื้นฐานแล้วอย่าสร้างวัตถุ RingTone ทุกครั้งที่คุณเล่น สร้างครั้งเดียวแล้วเล่นวัตถุเดียวกันหลาย ๆ ครั้ง
Tom Brinkkemper

205

ตอนนี้คุณสามารถทำได้โดยการรวมเสียงเมื่อสร้างการแจ้งเตือนแทนที่จะเรียกเสียงแยกต่างหาก

//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
วิธีนี้จะช่วยแก้ปัญหาต่าง ๆ - ไม่ใช่ "วิธีเล่นเสียงแจ้งเตือน" แต่ "วิธีเล่นเสียงแจ้งเตือนและแสดงเสียง" คำตอบที่ได้รับการยอมรับนั้นมีเหตุผลในการแก้ปัญหา
Fabian Tamp

7
บางทีคุณควรตั้งค่านี้ให้เล่นผ่าน STREAM_NOTIFICATION ดังนั้นจึงเล่นกับการตั้งค่าระดับเสียง OS ปัจจุบัน: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle มันทำงานได้ดี แต่ในกรณีที่มีการแจ้งเตือนหลายอย่างเช่นการแจ้งเตือน 100 ขนานเสียงที่ได้รับการผสมกับเสียงการแจ้งเตือนต่อไป มีเหตุผลหากเสียงที่เล่นแล้วควรรอให้การเล่นก่อนหน้าเสร็จสิ้น คุณช่วยได้ไหมในสถานการณ์นี้
Waqas Ali Razzaq

ไม่เล่นเสียงเมื่อแอปอยู่ในพื้นหลัง ข้อเสนอแนะใด ๆ
Sagar Nayak

47

หากคุณต้องการให้เสียงการแจ้งเตือนเริ่มต้นจากนั้นคุณสามารถใช้setDefaults (int)วิธีการของการNotificationCompat.Builderเรียน:

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

ฉันเชื่อว่าเป็นวิธีที่ง่ายที่สุดในการทำงานให้สำเร็จ


ไม่เล่นเสียงเมื่อแอปอยู่ในพื้นหลัง ข้อเสนอแนะใด ๆ
Sagar Nayak

13

ลองสิ่งนี้:

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

คำถามของคุณมานานแล้ว แต่ ... คุณลองตั้งค่าประเภทสตรีมเสียงหรือไม่?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

จะต้องทำก่อนเตรียม


2

ฉันมีคำถามเดียวกันสวยมาก หลังจากการวิจัยบางอย่างฉันคิดว่าถ้าคุณต้องการเล่น "เสียงแจ้งเตือน" ระบบเริ่มต้นคุณต้องแสดงการแจ้งเตือนและบอกให้ใช้เสียงเริ่มต้น และมีบางสิ่งที่จะกล่าวถึงการโต้แย้งในคำตอบอื่น ๆ ที่ถ้าคุณเล่นเสียงแจ้งเตือนคุณควรแสดงข้อความแจ้งเตือนด้วยเช่นกัน

อย่างไรก็ตาม API การแจ้งเตือนเพียงเล็กน้อยและคุณสามารถเข้าใกล้สิ่งที่คุณต้องการ คุณสามารถแสดงการแจ้งเตือนที่ว่างเปล่าจากนั้นลบออกโดยอัตโนมัติภายในสองสามวินาที ฉันคิดว่าสิ่งนี้จะได้ผลสำหรับฉัน บางทีมันอาจจะเหมาะกับคุณ

ฉันได้สร้างชุดวิธีการอำนวยความสะดวกcom.globalmentor.android.app.Notifications.javaที่ช่วยให้คุณสร้างเสียงการแจ้งเตือนเช่นนี้:

Notifications.notify(this);

ไฟ LED จะกะพริบและหากคุณอนุญาตการสั่นสะเทือนจะมีการสั่นสะเทือน ใช่ไอคอนการแจ้งเตือนจะปรากฏในแถบการแจ้งเตือน แต่จะหายไปภายในไม่กี่วินาที

ณ จุดนี้คุณอาจตระหนักว่าเนื่องจากการแจ้งเตือนจะหายไปคุณอาจมีข้อความทิกเกอร์การเลื่อนในแถบการแจ้งเตือนด้วยเช่นกัน คุณสามารถทำสิ่งนี้ได้:

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

มีวิธีอำนวยความสะดวกอื่น ๆ อีกมากมายในชั้นนี้ คุณสามารถดาวน์โหลดไลบรารีทั้งหมดจากที่เก็บ Subversion และสร้างด้วย Maven ขึ้นอยู่กับไลบรารี globalmentor-core ซึ่งสามารถสร้างและติดตั้งด้วย Maven ได้


นั่นเป็นวิธีที่ซับซ้อนในการเล่นเสียง คุณสามารถทำได้: stackoverflow.com/a/9622040/1417267
slinden77

1

คุณสามารถใช้NotificationและNotificationManagerเพื่อแสดงการแจ้งเตือนที่คุณต้องการ จากนั้นคุณสามารถปรับแต่งเสียงที่คุณต้องการเล่นด้วยการแจ้งเตือนของคุณ


5
ฉันไม่ต้องการแสดงการแจ้งเตือนฉันต้องการเล่นเสียงเท่านั้น
Ninjasense

1

ฉันคิดว่าแนวคิดของ "เสียงแจ้งเตือน" ผิดพลาดสำหรับ Android UI

พฤติกรรมที่คาดหวังของ Android คือการใช้การแจ้งเตือนมาตรฐานเพื่อแจ้งเตือนผู้ใช้ หากคุณเล่นเสียงการแจ้งเตือนโดยไม่มีไอคอนแถบสถานะคุณจะทำให้ผู้ใช้สับสน ("เสียงนั้นคืออะไรไม่มีไอคอนที่นี่ฉันอาจมีปัญหาการได้ยินหรือไม่")

ตัวอย่างเช่นวิธีการตั้งค่าเสียงในการแจ้งเตือนที่นี่: การตั้งค่าเสียงสำหรับการแจ้งเตือน


1
ไม่จริงนี่อาจเป็นการแจ้งเตือนในแอป ตัวอย่างเช่นหากคุณอยู่ในแอพแชทและมีเอฟเฟกต์เสียงเล็กน้อยสำหรับข้อความขาเข้าและขาออก สิ่งเหล่านี้เป็นการแจ้งเตือนและคุณต้องการให้พวกเขาปิดเมื่อโทรศัพท์อยู่ในโหมดเงียบ
copolii

คุณพูดถูก แต่นั่นเป็นอีกเรื่องหนึ่ง ฉันกำลังพูดถึง (สมมติว่านี่เป็นหัวข้อคำถาม) ของ "เสียงแจ้งเตือนระบบ" ซึ่งอยู่ในระบบ Android GUI แน่นอนเมื่อคุณอยู่ในแอพของคุณเองตามที่คุณต้องการ
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
ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันที คำอธิบายที่เหมาะสมมากจะเพิ่มมูลค่าในระยะยาวด้วยการแสดงเหตุผลนี้เป็นทางออกที่ดีในการแก้ไขปัญหาและจะทำให้มันมีประโยชน์มากขึ้นให้กับผู้อ่านในอนาคตกับอื่น ๆ คำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติฐานที่คุณทำ
NOHS

0

ตั้งค่าเสียงเป็นช่องการแจ้งเตือน

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

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

        channel.setSound(alarmUri, attributes);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.