Cara memainkan nada dering / suara alarm di Android

119

Saya telah mencari kemana-mana cara memainkan nada dering / suara alarm di Android.

Saya menekan sebuah tombol dan saya ingin memutar nada dering / alarm. Saya tidak dapat menemukan sampel yang mudah dan langsung. Ya, saya sudah melihat kode sumber jam Alarm ... tetapi tidak langsung dan saya tidak dapat menyusunnya.

Saya tidak bisa membuat ini berhasil:

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

Saya mendapatkan kesalahan ini:

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

Jadi .. tolong jika ada yang tahu cara memainkan nada dering / alarm default, beri tahu saya.

Saya memilih untuk tidak mengunggah file apa pun. Mainkan saja nada dering default.

Federico
sumber

Jawaban:

186

Anda cukup memainkan nada dering yang disetel dengan ini:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
markov00
sumber
Saya masih mendapatkan kesalahan - Gagal membuka konten nada dering: // pengaturan / sistem / alarm_alert
Desai
3
Bagus dan sederhana. Namun, bergantung pada perangkatnya, metode ini dapat mengganggu suara lain (seperti musik) yang mungkin diputar di Android.
igordc
Menggunakan getApplicationContext () mungkin bukan opsi yang sangat baik. Info lebih lanjut di sini: stackoverflow.com/questions/9122627/…
Saket
@BartSimpson bagaimana Anda menyelesaikan masalah saya juga mendapatkan kesalahan ini
pengguna3233280
1
Ringtone tidak bisa dihentikan. Jika memulai nada dering lagi, putar ganda. stopPrevious tidak berfungsi, dengan cara saya membuat ringtone player dengan objek konteks yang sama, bukan getapplicationcontext.
Metehan Toksoy
65

Jika pengguna tidak pernah menyetel alarm di ponselnya, TYPE_ALARM dapat mengembalikan null. Anda dapat menjelaskan ini dengan:

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);                
    }
}
Blundell
sumber
1
URI yang dikembalikan mungkin tidak ditampilkan nullmeskipun tidak mengarah ke suara yang valid. Anda harus menguji nilai kembalian RingtoneManager.getRingtone()untuk nullsebagai gantinya / juga
Attila
Pada 2017, tidak berfungsi gagal berdering. Apakah Anda sudah membuatnya berfungsi di Android terkini?
55

Ini adalah cara yang saya lakukan:

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

Ini mirip dengan cara markov00, tetapi menggunakan MediaPlayer daripada Ringtone yang mencegah interupsi suara lain, seperti musik, yang mungkin sudah diputar di latar belakang.

igordc
sumber
5
Saya mencoba jawaban teratas (ringtone.play) tetapi suaranya mungkin terputus. Saya menggunakan pendekatan ini dan berhasil dengan sempurna.
wyz
1
Ini adalah solusi yang lebih baik untuk siapa saja yang menggunakan komponen audio lain di aplikasi mereka.
EntangledLoops
@YumYumYum, saya baru saja menguji dan berhasil. Saya tidak melakukan apa pun kecuali memasukkan kode di atas ke dalam setOnClickListner saya. Apa yang kamu lakukan?
fitur langit
17

Contoh Anda pada dasarnya adalah apa yang saya gunakan. Namun, ini tidak pernah berfungsi pada emulator, karena emulator tidak memiliki nada dering apa pun secara default, dan content://settings/system/ringtonetidak menyelesaikan apa pun yang dapat dimainkan. Ini berfungsi dengan baik di ponsel saya yang sebenarnya.

sinis
sumber
11

Ini berfungsi dengan baik:

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();
Kamran Ahmed
sumber
2
Mengapa Anda membagi volume dengan 7,0? Apakah itu nilai kerja yang umum diketahui atau sesuatu yang Anda gali sendiri?
ErGo_404
Sesuatu yang saya gali ...: D
Kamran Ahmed
Mengapa Anda melakukan Float.parseFloat (Double.toString (....)) ?? Melalui instance String karena Anda ingin konversi double-> float? Kenapa kamu melakukan ini?
Zordid
1
Bagian ini adalah Uri.parse redundan (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () mengembalikan URI, tidak perlu menguraikannya lagi ke URI lain
DritanX
1
7 adalah volume maksimal untuk stram
Leo Droidcoder
11

Untuk calon karyawan Google: gunakan RingtoneManager.getActualDefaultRingtoneUri()sebagai pengganti RingtoneManager.getDefaultUri(). Sesuai dengan namanya, itu akan mengembalikan uri yang sebenarnya, jadi Anda bisa dengan bebas menggunakannya. Dari dokumentasi getActualDefaultRingtoneUri():

Mendapat Uri suara default saat ini. Ini akan memberikan suara Uri yang sebenarnya , daripada menggunakan ini, kebanyakan klien dapat menggunakan DEFAULT_RINGTONE_URI.

Sementara itu getDefaultUri()mengatakan ini:

Mengembalikan Uri untuk nada dering default dari jenis tertentu. Alih-alih mengembalikan suara nada dering Uri yang sebenarnya, ini akan mengembalikan Uri simbolis yang akan diselesaikan ke suara sebenarnya saat dimainkan.

Matvey Rybakov
sumber
9

Anda dapat mendorong file MP3 di folder / sdcard Anda menggunakan DDMS, restart emulator, kemudian buka aplikasi Media, telusuri file MP3 Anda, tekan lama padanya dan pilih "Use as phone ringtone".

Kesalahan hilang!

Edit: masalah yang sama dengan suara notifikasi (misalnya untuk SMS) diselesaikan menggunakan aplikasi Ringdroid

OcuS
sumber
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);
    }
}
Kumar cerah
sumber
darimana AlarmServiceasalnya
Eduardo Wada
2

Menyalin file audio ke kartu sd emulator dan memilihnya melalui pemutar media sebagai nada dering default memang menyelesaikan masalah.

Valentin Klinghammer
sumber
2

Anda dapat menggunakan kode contoh ini:

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

if (ringtoneSound != null) {
    ringtoneSound.play();
}
Gio MV
sumber
0

Mungkin terlambat tetapi ada solusi sederhana baru untuk pertanyaan ini untuk siapa pun yang menginginkannya.
Di kotlin

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

Kode di atas akan memainkan nada dering default tetapi jika Anda ingin alarm default, ubah

Settings.System.DEFAULT_RINGTONE_URI

untuk

Settings.System.DEFAULT_ALARM_ALERT_URI

Reza
sumber
-4

Berikut beberapa contoh kode:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
Nishant
sumber
Jelaskan kode dengan sedikit penjelasan, Jawaban kode saja tidak dihargai.
Sulthan Allaudeen
Ayolah, Anda mungkin pernah membaca jawaban di atas. stackoverflow.com/a/20177743/3332634
yshahak
1
Ini pada dasarnya identik dengan jawaban ini , tetapi dengan nama variabel, mediaPlayerbukan mp.
Makyen