MediaPlayer-setAudioAttributes无法正常工作

时间:2019-05-19 18:36:58

标签: java android kotlin android-mediaplayer android-alarms

我正在尝试创建警报,但一切正常,但是即使我使用STREAM_ALARM,流类型也始终是媒体,因为setStreamType已过时,因此我正在使用{{1} }代替,但似乎不起作用。 这是我的代码:

setAudioAttributes

2 个答案:

答案 0 :(得分:1)

问题是您正在使用方法MediaPlayer创建MediaPlayer.create(),并且如果以后那样做,则无法更改AudioAttributes

来自the documentation

  

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

     

使用MediaPlayer完成后,您应该调用release()来释放   资源。如果不发布,将导致太多MediaPlayer实例   例外。

     

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

代替使用create(),只需使用默认构造函数MediaPlayer实例化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();

答案 1 :(得分:0)

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()
    }