首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MediaPlayer - setAudioAttributes不能正常工作

MediaPlayer - setAudioAttributes不能正常工作
EN

Stack Overflow用户
提问于 2019-05-19 18:36:57
回答 2查看 4.9K关注 0票数 1

我试图创建一个警报,一切都很好,但是流类型始终是媒体类型,即使我使用STREAM_ALARM,因为setStreamType是不推荐的,所以我使用setAudioAttributes代替,但它似乎不起作用。这是我的密码:

代码语言:javascript
运行
复制
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()
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中,它应该是这样的:

代码语言:javascript
运行
复制
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();
票数 14
EN

Stack Overflow用户

发布于 2021-01-05 11:24:44

Kotlin版本

代码语言:javascript
运行
复制
    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()
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56210872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档