【问题标题】: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()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多