首页 > 解决方案 > MediaPlayer - setAudioAttributes 无法正常工作

问题描述

我正在尝试创建警报,一切正常,但即使我使用流类型也始终是媒体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()
    }
}

标签: javaandroidkotlinandroid-mediaplayerandroid-alarms

解决方案


问题是您正在MediaPlayer使用该方法创建,如果您这样做,MediaPlayer.create()则无法更改后者。AudioAttributes

文档中

为给定资源 ID 创建 MediaPlayer 的便捷方法。成功时,prepare() 将已经被调用,并且不能再次调用。

完成 MediaPlayer 后,您应该调用 release() 来释放资源。如果不释放,过多的 MediaPlayer 实例将导致异常。

请注意,由于在此方法中会自动调用 prepare(),因此您无法更改新 MediaPlayer 的音频会话 ID(参见 setAudioSessionId(int))或音频属性(参见 setAudioAttributes(android.media.AudioAttributes)。

而不是 using create(),只需实例化MediaPlayerusing 默认构造函数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();

推荐阅读