Cách phát nhạc chuông / âm thanh báo thức trong Android


119

Tôi đã tìm kiếm khắp nơi cách phát nhạc chuông / âm thanh báo thức trong Android.

Tôi nhấn một nút và muốn phát nhạc chuông / âm báo thức. Tôi không thể tìm thấy một mẫu đơn giản, dễ dàng. Có, tôi đã xem mã nguồn Đồng hồ báo thức ... nhưng nó không đơn giản và tôi không thể biên dịch nó.

Tôi không thể làm cho nó hoạt động:

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

Tôi gặp lỗi này:

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

Vì vậy, nếu ai đó biết cách chơi nhạc chuông / báo thức mặc định cho tôi biết.

Tôi không muốn tải lên bất kỳ tệp nào. Chỉ phát nhạc chuông mặc định.

Câu trả lời:


186

Bạn có thể chỉ cần phát nhạc chuông đã cài đặt với cái này:

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

Tôi vẫn nhận được một lỗi - Không thể nội dung nhạc chuông mở: // settings / system / alarm_alert
Pritesh Desai

3
Đẹp và đơn giản. Tuy nhiên, tùy thuộc vào thiết bị, phương pháp này có thể làm gián đoạn các âm thanh khác (như nhạc) có thể đang phát trong Android.
igordc

Sử dụng getApplicationContext () có thể không phải là một lựa chọn tốt. Thông tin thêm tại đây: stackoverflow.com/questions/9122627/…
Saket

@BartSimpson cách giải quyết vấn đề u im cũng nhận được lỗi này
user3233280

1
Nhạc chuông không thể dừng lại. Nếu bắt đầu lại nhạc chuông, hãy phát gấp đôi. stopPre Before không hoạt động, bằng cách tôi tạo trình phát nhạc chuông với cùng một đối tượng ngữ cảnh, không phải getapplicationcontext.
Metehan Toksoy

65

Nếu người dùng chưa bao giờ đặt báo thức trên điện thoại của họ, TYPE_ALARM có thể trả về giá trị rỗng. Bạn có thể giải thích điều này với:

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 trả về có thể không phải là nullmặc dù nó không trỏ đến âm thanh hợp lệ. Bạn nên kiểm tra giá trị trả về RingtoneManager.getRingtone()cho nullthay / cũng như-
Attila

Trong năm 2017, không hoạt động không đổ chuông. Bạn có nó hoạt động trong Android gần đây không?

55

Đây là cách tôi đã làm:

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

Nó tương tự như cách của markov00, nhưng sử dụng MediaPlayer thay vì Ringtone, ngăn chặn làm gián đoạn các âm thanh khác, chẳng hạn như nhạc, có thể đã phát trong nền.


5
Tôi đã thử câu trả lời hàng đầu (ringtone.play) nhưng âm thanh có thể bị ngắt. Tôi đã sử dụng cách tiếp cận này và nó hoạt động hoàn hảo.
wyz

1
Đây là giải pháp tốt hơn cho bất kỳ ai sử dụng bất kỳ thành phần âm thanh nào khác trong ứng dụng của họ.
EntangledLoops

@YumYumYum, tôi vừa thử nghiệm và nó hoạt động. Tôi không làm gì ngoài việc đặt đoạn mã trên vào setOnClickListner của mình. Bạn đã làm gì?
tính năng bầu trời

17

Ví dụ của bạn về cơ bản là những gì tôi đang sử dụng. Tuy nhiên, nó không bao giờ hoạt động trên trình giả lập vì trình giả lập không có bất kỳ nhạc chuông nào theo mặc định và content://settings/system/ringtonekhông giải quyết được bất kỳ thứ gì có thể chơi được. Nó hoạt động tốt trên điện thoại thực tế của tôi.


11

Điều này hoạt động tốt:

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
Tại sao bạn lại chia khối lượng cho 7.0? Nó là một giá trị làm việc thường được biết đến hay một cái gì đó bạn tự tìm ra?
ErGo_404

Một cái gì đó tôi đào ra ...: D
Kamran Ahmed

Tại sao bạn làm Float.parseFloat (Double.toString (....)) ?? Đi qua một cá thể Chuỗi vì bạn muốn chuyển đổi double-> float? Tại sao bạn làm điều này?
Zordid

1
Phần này là không cần thiết Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () trả về một URI đã có, không cần phải phân tích nó chưa vào một URI
DritanX

1
7 là âm lượng tối đa cho
dải

11

Đối với các googlers trong tương lai: sử dụng RingtoneManager.getActualDefaultRingtoneUri()thay vì RingtoneManager.getDefaultUri(). Theo tên gọi của nó, nó sẽ trả về chiếc tiểu thực, vì vậy bạn có thể thoải mái sử dụng nó. Từ tài liệu của getActualDefaultRingtoneUri():

Nhận Uri của âm thanh mặc định hiện tại. Điều này sẽ cung cấp âm thanh thực tế Uri, thay vì sử dụng điều này, hầu hết khách hàng có thể sử dụng DEFAULT_RINGTONE_URI.

Trong khi đó getDefaultUri()nói điều này:

Trả về Uri cho nhạc chuông mặc định của một loại cụ thể. Thay vì trả lại âm thanh của nhạc chuông thực tế Uri, điều này sẽ trả lại Uri tượng trưng sẽ chuyển thành âm thanh thực khi phát.


9

Bạn có thể đẩy tệp MP3 vào thư mục / sdcard của mình bằng DDMS, khởi động lại trình giả lập, sau đó mở ứng dụng Phương tiện, duyệt đến tệp MP3 của bạn, nhấn và giữ tệp đó và chọn "Sử dụng làm nhạc chuông điện thoại".

Đã hết lỗi!

Chỉnh sửa: cùng một vấn đề với âm thanh thông báo (ví dụ: đối với SMS) được giải quyết bằng ứng dụng 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);
    }
}

nơi nào AlarmServiceđến từ đâu?
Eduardo Wada

2

Sao chép tệp âm thanh vào thẻ sd của trình giả lập và chọn nó qua trình phát đa phương tiện làm nhạc chuông mặc định thực sự giải quyết được vấn đề.


2

Bạn có thể sử dụng mã mẫu này:

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

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

0

Có thể là muộn nhưng có một giải pháp đơn giản mới cho câu hỏi này cho những ai từng muốn nó.
Trong kotlin

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

Đoạn mã trên sẽ phát nhạc chuông mặc định nhưng nếu bạn muốn báo thức mặc định, hãy thay đổi

Settings.System.DEFAULT_RINGTONE_URI

đến

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

Đây là một số mã mẫu:

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

Giải thích mã với một chút giải thích, các câu trả lời Chỉ mã không được đánh giá cao.
Sulthan Allaudeen

Cố lên anh bạn, có lẽ bạn chưa bao giờ đọc những câu trả lời ở trên. stackoverflow.com/a/20177743/3332634
yshahak

1
Điều này về cơ bản giống với câu trả lời này , nhưng với tên biến mediaPlayerthay vì mp.
Makyen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.