我正在尝试创建警报,一切正常,但流类型始终是媒体,即使我使用STREAM_ALARM
, since setStreamType
已弃用,我正在使用setAudioAttributes
相反,但它似乎不起作用。
这是我的代码:
class AlarmRingtoneManager(val context: Context) {
private lateinit var mediaPlayer: MediaPlayer
fun start() {
mediaPlayer = MediaPlayer.create(context, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM))
.apply {
setAudioAttributes(AudioAttributes.Builder()
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
.setLegacyStreamType(AudioManager.STREAM_ALARM)
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build())
isLooping = true
start()
}
}
fun stop() {
mediaPlayer.stop()
}
}
问题是你正在创建MediaPlayer
使用该方法MediaPlayer.create()
,并且不可能改变AudioAttributes
稍后如果你这样做的话。
From 文档 https://developer.android.com/reference/android/media/MediaPlayer#create(android.content.Context,%2520int):
为给定资源 ID 创建 MediaPlayer 的便捷方法。在
成功,prepare() 已经被调用并且不能被调用
又打电话来了。
使用完 MediaPlayer 后,您应该调用 release() 来释放
资源。如果不释放,会导致MediaPlayer实例过多
在一个例外中。
请注意,由于在该方法中会自动调用prepare(),因此您
无法更改音频会话 ID(请参阅 setAudioSessionId(int))或
音频属性(参见
新的 setAudioAttributes(android.media.AudioAttributes)
媒体播放器。
而不是使用create()
,只需实例化MediaPlayer
使用默认构造函数new MediaPlayer();
。然后,使用方法设置源setDataSource()
并像之前一样设置其余的 AudioAttributes。
我不了解 Kotlin,但在 Java 中它看起来像这样:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(AudioAttributes.Builder()
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
.setLegacyStreamType(AudioManager.STREAM_ALARM)
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
mediaPlayer.setDataSource(context, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
mediaPlayer.setLooping(true);
mediaPlayer.prepare();
mediaPlayer.start();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)