วิธีเล่นเสียงเรียกเข้า / เสียงปลุกใน Android


119

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

ฉันกดปุ่มและฉันต้องการเล่นเสียงเรียกเข้า / เสียงปลุก ฉันไม่พบตัวอย่างที่ง่ายและตรงไปตรงมา ใช่ฉันดูซอร์สโค้ดนาฬิกาปลุกแล้ว ... แต่มันไม่ตรงไปตรงมาและฉันไม่สามารถรวบรวมมันได้

ฉันไม่สามารถทำงานนี้ได้:

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

ฉันได้รับข้อผิดพลาดนี้:

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

ดังนั้น .. หากใครรู้วิธีเล่นเสียงเรียกเข้า / สัญญาณเตือนเริ่มต้นโปรดแจ้งให้เราทราบ

ฉันไม่ต้องการอัปโหลดไฟล์ใด ๆ เพียงแค่เล่นเสียงเรียกเข้าเริ่มต้น

คำตอบ:


186

คุณสามารถเล่นเสียงเรียกเข้าที่ตั้งค่าได้ด้วยสิ่งนี้:

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

ฉันยังคงได้รับข้อผิดพลาด - ไม่สามารถเปิดเนื้อหาเสียงเรียกเข้า: // settings / system / alarm_alert
Pritesh Desai

3
สวยและเรียบง่าย อย่างไรก็ตามวิธีนี้อาจขัดจังหวะเสียงอื่น ๆ (เช่นเพลง) ที่อาจเล่นใน Android ทั้งนี้ขึ้นอยู่กับอุปกรณ์
igordc

การใช้ getApplicationContext () อาจไม่ใช่ตัวเลือกที่ดีนัก ข้อมูลเพิ่มเติมที่นี่: stackoverflow.com/questions/9122627/…
สะเก็ด

@BartSimpson วิธีที่คุณแก้ไขปัญหาฉันยังได้รับข้อผิดพลาดนี้
user3233280

1
เสียงเรียกเข้าไม่สามารถหยุดได้ หากเริ่มเสียงเรียกเข้าอีกครั้งให้เล่นสองครั้ง stopPrevious ไม่ทำงานโดยวิธีที่ฉันสร้างโปรแกรมเล่นเสียงเรียกเข้าด้วยวัตถุบริบทเดียวกันไม่ใช่ getapplicationcontext
Metehan Toksoy

65

หากผู้ใช้ไม่เคยตั้งปลุกในโทรศัพท์ TYPE_ALARM จะคืนค่าว่าง คุณสามารถอธิบายสิ่งนี้ด้วย:

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
URI ที่ส่งคืนอาจไม่ใช่nullแม้ว่าจะไม่ได้ชี้ไปที่เสียงที่ถูกต้องก็ตาม คุณควรทดสอบค่าตอบแทนของRingtoneManager.getRingtone()สำหรับnullแทน / เป็นดี
อัตติลา

ในปี 2560 การทำงานไม่ได้ดังขึ้น คุณใช้งานได้ใน Android ล่าสุดหรือไม่?

55

นี่คือวิธีที่ฉันทำ:

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

คล้ายกับวิธีของ markov00 แต่ใช้ MediaPlayer แทน Ringtone ซึ่งจะป้องกันไม่ให้เสียงอื่น ๆ มาขัดจังหวะเช่นเพลงที่อาจเล่นอยู่เบื้องหลัง


5
ฉันลองใช้คำตอบด้านบน (เสียงเรียกเข้าเล่น) แต่เสียงอาจถูกตัดออก ฉันใช้วิธีนี้และได้ผลดี
wyz

1
นี่เป็นทางออกที่ดีกว่าสำหรับทุกคนที่ใช้ส่วนประกอบเสียงอื่น ๆ ในแอปของตน
EntangledLoops

@ YumYumYum ฉันเพิ่งทดสอบและได้ผล ฉันไม่ได้ทำอะไรเลยนอกจากใส่โค้ดด้านบนลงใน setOnClickListner ของฉัน คุณทำอะไรลงไป?
แสดงท้องฟ้า

17

ตัวอย่างของคุณคือสิ่งที่ฉันใช้อยู่ อย่างไรก็ตามมันจะไม่ทำงานบนโปรแกรมจำลองเนื่องจากโปรแกรมจำลองไม่มีเสียงเรียกเข้าใด ๆ ตามค่าเริ่มต้นและcontent://settings/system/ringtoneไม่สามารถแก้ไขสิ่งที่สามารถเล่นได้ มันใช้งานได้ดีบนโทรศัพท์จริงของฉัน


11

ใช้งานได้ดี:

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
ทำไมคุณหารปริมาตรด้วย 7.0? เป็นค่านิยมในการทำงานที่รู้จักกันทั่วไปหรือเป็นสิ่งที่คุณขุดเอาเอง
ErGo_404

สิ่งที่ฉันขุดออกมา ... : D
Kamran Ahmed

ทำไมคุณถึงทำ Float.parseFloat (Double.toString (.... )) ?? ผ่านอินสแตนซ์ String เพราะคุณต้องการการแปลงแบบ double-> float? ทำไมคุณทำเช่นนี้?
Zordid

1
ส่วนนี้ซ้ำซ้อน Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () ส่งคืน URI แล้วไม่จำเป็นต้องแยกวิเคราะห์เป็น URI อื่น
DritanX

1
7 เป็นระดับเสียงสูงสุดสำหรับ Stram
Leo Droidcoder

11

สำหรับ Googler ในอนาคต: ใช้RingtoneManager.getActualDefaultRingtoneUri()แทนRingtoneManager.getDefaultUri(). ตามชื่อของมันมันจะคืนค่าอูริจริงดังนั้นคุณจึงสามารถใช้มันได้อย่างอิสระ จากเอกสารของgetActualDefaultRingtoneUri():

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

ในขณะเดียวกันgetDefaultUri()กล่าวว่า:

ส่งคืน Uri สำหรับเสียงเรียกเข้าเริ่มต้นของประเภทใดประเภทหนึ่ง แทนที่จะส่งคืนเสียงเรียกเข้าของ Uri จริงสิ่งนี้จะส่งคืนUri สัญลักษณ์ซึ่งจะแก้ไขเป็นเสียงจริงเมื่อเล่น


9

คุณสามารถพุชไฟล์ MP3 ในโฟลเดอร์ / sdcard ของคุณโดยใช้ DDMS รีสตาร์ทโปรแกรมจำลองจากนั้นเปิดแอปพลิเคชัน Media เรียกดูไฟล์ MP3 ของคุณกดค้างไว้แล้วเลือก "ใช้เป็นเสียงเรียกเข้าโทรศัพท์"

ข้อผิดพลาดหายไป!

แก้ไข: ปัญหาเดียวกันกับเสียงแจ้งเตือน (เช่น SMS) แก้ไขได้โดยใช้แอปพลิเคชัน Ringdroid


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

ที่ไม่AlarmServiceมาจากไหน?
Eduardo Wada

2

การคัดลอกไฟล์เสียงไปยังการ์ด sd ของโปรแกรมจำลองและเลือกผ่านเครื่องเล่นสื่อเนื่องจากเสียงเรียกเข้าเริ่มต้นช่วยแก้ปัญหาได้อย่างแท้จริง


2

คุณสามารถใช้โค้ดตัวอย่างนี้:

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

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

0

อาจจะสายไป แต่มีวิธีง่ายๆใหม่สำหรับคำถามนี้สำหรับผู้ที่เคยต้องการ
ในกอตลิน

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

โค้ดด้านบนจะเล่นเสียงเรียกเข้าเริ่มต้น แต่ถ้าคุณต้องการปลุกเริ่มต้นให้เปลี่ยน

Settings.System.DEFAULT_RINGTONE_URI

ถึง

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

นี่คือโค้ดตัวอย่างบางส่วน:

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

อธิบายโค้ดด้วยคำอธิบายเล็กน้อยโค้ดจะไม่ชื่นชมคำตอบเท่านั้น
Sulthan Allaudeen

มาเถอะคุณไม่เคยอ่านคำตอบข้างต้น stackoverflow.com/a/20177743/3332634
yshahak

1
โดยพื้นฐานแล้วจะเหมือนกับไฟล์ คำตอบนี้แต่มีชื่อตัวแปรแทนmediaPlayer mp
Makyen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.