如何在Android中播放铃声/闹钟声音

我一直在寻找如何在Android中播放铃声/闹钟声音。

我按了一个button,我想播放铃声/闹钟声音。 我找不到一个简单,直接的样本。 是的,我已经看了闹钟源代码…但它不是直接的,我不能编译它。

我不能做这个工作:

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 

所以..请如果有人知道如何发挥默认的铃声/闹钟让我知道。

我不想上传任何文件。 只需播放默认的铃声。

你可以简单地播放一个设置的铃声:

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

如果用户从未在手机上设置过闹钟,那么TYPE_ALARM可以返回null。 你可以用下面的方法解释

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

这是我做的方式:

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

它与markov00的方式类似,但使用MediaPlayer而不是铃声,以防止中断其他声音,如音乐,可能已经在后台播放。

你的例子基本上是我用的。 然而,它从来不在模拟器上工作,因为模拟器默认没有任何铃声, content://settings/system/ringtone没有parsing为任何可播放的东西。 它在我的实际电话上工作正常。

您可以使用DDMS在/ sdcard文件夹中推送MP3文件,重新启动模拟器,然后打开媒体应用程序,浏览至MP3文件,长按上面的文件并select“用作手机铃声”。

错误消失了!

编辑:与使用Ringdroid应用程序解决通知声音(例如SMS)相同的麻烦

这工作正常:

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

将audio文件复制到模拟器的SD卡上,并通过媒体播放器将其选定为默认铃声确实可以解决问题。

你可以使用这个示例代码:

 Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri) if (ringtoneSound != null) { ringtoneSound.play(); } 
 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); } } 

对于未来的googlers:使用RingtoneManager.getActualDefaultRingtoneUri()而不是RingtoneManager.getDefaultUri() 。 根据它的名字,它会返回实际的uri,所以你可以自由使用它。 从getActualDefaultRingtoneUri()文档:

获取当前的默认声音的Uri。 这将给实际的声音Uri,而不是使用这个,大多数客户端可以使用DEFAULT_RINGTONE_URI。

同时getDefaultUri()说:

返回特定types的默认铃声的Uri。 而不是返回实际的铃声的声音Uri,这将返回符号 Uri,这将在播放时parsing为实际的声音。

以下是一些示例代码:

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