我试图创建一个警报,一切都很好,但是流类型始终是媒体类型,即使我使用STREAM_ALARM
,因为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()
}
}
发布于 2019-05-22 12:25:57
问题是,您正在使用方法MediaPlayer
创建MediaPlayer.create()
,如果您这样做,以后不可能更改AudioAttributes
。
来自文献资料
为给定的资源id创建MediaPlayer的方便方法。在成功时,准备()已经被调用,不能再次调用. 在使用MediaPlayer时,您应该调用release()来释放资源。如果不发布,过多的MediaPlayer实例将导致异常。 注意,由于准备()在此方法中是自动调用的,因此不能更改音频会话ID (参见setAudioAttributes(android.media.AudioAttributes) (Int))或音频属性(请参阅新的MediaPlayer.的setAudioSessionId)。
而不是使用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();
发布于 2021-01-05 11:24:44
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()
}
https://stackoverflow.com/questions/56210872
复制相似问题