如何在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

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

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

Answers:


186

您可以简单地播放设置好的铃声:

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

我仍然遇到错误-无法打开铃声content:// settings / system / alarm_alert
Pritesh Desai

3
漂亮又简单。但是,根据设备的不同,此方法可能会中断可能在Android中播放的其他声音(例如音乐)。
igordc

使用getApplicationContext()可能不是一个很好的选择。此处的更多信息:stackoverflow.com/questions/9122627/…–
Saket

@BartSimpson您如何解决问题,即时消息我也收到此错误
user3233280 2014年

1
铃声无法停止。如果再次启动铃声,则播放两次。stopPrevious不起作用,顺便说一句,我用相同的上下文对象而不是getapplicationcontext创建铃声播放器。
Metehan Toksoy

65

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

1
null即使未指向有效声音,返回的URI也可能不是。您应该测试的返回值,RingtoneManager.getRingtone()用于null代替/ AS-以及
阿提拉

在2017年,没有工作未能响起。可以在最近的Android中使用吗?

55

这是我做的方法:

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

它与markov00的方法类似,但是使用MediaPlayer而不是Ringtone来防止打断可能已经在后台播放的其他声音(例如音乐)。


5
我尝试了最佳答案(ringtone.play),但声音可能被切断。我使用了这种方法,并且效果很好。
wyz 2015年

1
对于在其应用程序中使用任何其他音频组件的任何人来说,这都是一个更好的解决方案。
EntangledLoops 2015年

@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 2013年

我挖出来的东西...: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一个最大音量
狮子座Droidcoder

11

对于未来的Google员工:使用RingtoneManager.getActualDefaultRingtoneUri()代替RingtoneManager.getDefaultUri()。根据名称,它将返回实际的uri,因此您可以自由使用它。来自以下文档getActualDefaultRingtoneUri()

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

同时getDefaultUri()说:

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


9

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

错误消失了!

编辑:使用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 2014年

拜托,您可能从未读过上面的答案。stackoverflow.com/a/20177743/3332634
yshahak

1
这个答案基本上是一样的,但是用变量名mediaPlayer代替mp
Makyen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.