【问题标题】:MediaPlayer - setAudioAttributes not working properlyMediaPlayer - setAudioAttributes 无法正常工作
【发布时间】:2019-05-19 18:36:57
【问题描述】:
我正在尝试创建警报,一切正常,但流类型始终是媒体,即使我使用 STREAM_ALARM,因为 setStreamType 已弃用,我正在使用 setAudioAttributes,但它没有t 似乎工作。
这是我的代码:
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()
}
}
【问题讨论】:
标签:
java
android
kotlin
android-mediaplayer
android-alarms
【解决方案1】:
问题是您正在使用MediaPlayer.create() 方法创建MediaPlayer,如果您这样做,以后无法更改AudioAttributes。
来自the documentation:
为给定资源 ID 创建 MediaPlayer 的便捷方法。 开启
成功,prepare() 已经被调用并且不能被调用
再次调用。
当使用 MediaPlayer 完成后,您应该调用 release() 来释放
资源。如果不释放,会导致 MediaPlayer 实例过多
在一个例外中。
请注意,由于在此方法中会自动调用 prepare(),因此您
无法更改音频会话 ID(请参阅 setAudioSessionId(int))或
音频属性(见
setAudioAttributes(android.media.AudioAttributes) 的新
媒体播放器。
不使用create(),只需使用默认构造函数new MediaPlayer(); 实例化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();
【解决方案2】:
Kotlin 版本
val uri = Settings.System.DEFAULT_ALARM_ALERT_URI ?: Settings.System.DEFAULT_RINGTONE_URI
uri?.let {
val player = MediaPlayer()
player.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
)
//player.reset() //uncomment this line if you use local variable of MediaPlayer
player.setDataSource(this@AlarmActivity, it)
player.prepare()
player.start()
}