java - 播放声音作为媒体/闹钟/铃声?
问题描述
我的应用会发出警报。在 Android 声音设置中,此声音由“响铃音量”滑块而不是“闹钟音量”滑块控制。如何更改由“警报音量”控制的声音?
public void doAlarm(){
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
if (!r.isPlaying())
r.play();
}
我曾尝试使用 setAudioAttributes,但结果是“媒体音量”滑块控制了音量:
public void doAlarm(){
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.setAudioAttributes(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build());
mp.setLooping(true);
mp.start();
}
我错过了什么?
解决方案
我找到了解决方案:不使用该.create()
方法。而是使用.setDataSource()
和.prepare()
。下面的代码:
public void ringAlarm() {
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
}
if (alarmUri == null) {
Log.e("ringAlarm" , "alarmUri null. Unable to get default sound URI");
return;
}
MediaPlayer mp = new MediaPlayer();
// This is what sets the media type as alarm
// Thus, the sound will be influenced by alarm volume
mp.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM).build());
try {
mp.setDataSource(getApplicationContext(), alarmUri);
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
// To continuously loop the alarm sound
mp.setLooping(true);
mp.start();
}
推荐阅读
- jackson - Jackson 解析具有不同类的 XML 文件,这些类都继承自同一个父类
- javascript - 标记和扫描算法是否仅适用于参考?
- selenium - Selenium 无法绕过 NTLM 身份验证对话框
- r - R闪亮的地图标记点击事件
- javascript - 如何在 three.js 上添加 OrbitControls
- javascript - 仅当在 JavaScript 中单击按钮时才激活预加载器
- python - 如何在使用 SQLACHEMY 作为 ORM 的顾问中转换 thi 查询
- javascript - vuejs从js方法DOM创建onclick事件
- android - 在 ViewHolder 中添加 Listener 用于 Fragment 与 Activity 通信
- html - img 没有拉伸到包装器的高度和宽度