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

时间:2010-04-11 18:28:45

标签: android android-emulator

我一直在寻找如何在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

所以......如果有人知道如何播放默认铃声/闹钟,请告诉我。

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

13 个答案:

答案 0 :(得分:171)

您可以使用以下方式播放设定的铃声:

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

答案 1 :(得分:62)

如果用户从未在手机上设置闹钟,则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);                
    }
}

答案 2 :(得分:50)

这就是我的方式:

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

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

答案 3 :(得分:17)

你的例子基本上就是我正在使用的。但是,它永远不会在模拟器上运行,因为默认情况下模拟器没有任何铃声,content://settings/system/ringtone无法解析任何可播放的内容。它在我的实际手机上运行良好。

答案 4 :(得分:10)

这很好用:

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

答案 5 :(得分:9)

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

错误消失了!

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

答案 6 :(得分:9)

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

  

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

同时getDefaultUri()说:

  

返回特定类型的默认铃声的Uri。而不是返回实际铃声的声音Uri,这将返回 符号 Uri,它将在播放时解析为实际声音。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

将音频文件复制到模拟器的SD卡并通过媒体播放器选择它作为默认铃声确实解决了问题。

答案 9 :(得分:2)

您可以使用此示例代码:

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

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

答案 10 :(得分:0)

可能已经晚了,但是对于谁愿意的人,这个问题有一个新的简单解决方案。
在科特林

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

以上代码将播放默认铃声,但如果您需要默认闹钟,请更改

Settings.System.DEFAULT_RINGTONE_URI

Settings.System.DEFAULT_ALARM_ALERT_URI

答案 11 :(得分:0)

您可以使用以下代码;

val ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
// for alarm
// val ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
val ringtoneSound: Ringtone = RingtoneManager.getRingtone(requireContext(), ringtoneUri)
    ringtoneSound.play()

停止;

ringtoneSound.stop()

答案 12 :(得分:-3)

以下是一些示例代码:

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