MediaPlayer - setAudioAttributes не работает должным образом - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать будильник, все работает нормально, но тип потока всегда медиа, даже если я использую 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()
    }
}

1 Ответ

1 голос
/ 22 мая 2019

Проблема в том, что вы создаете MediaPlayer с использованием метода MediaPlayer.create(), и невозможно изменить AudioAttributes позже, если вы сделаете это таким образом.

С документация :

Удобный метод для создания MediaPlayer для данного идентификатора ресурса. О success, prepare () уже вызван и не должен быть позвонил снова.

Когда закончите с MediaPlayer, вы должны вызвать release (), чтобы освободить Ресурсы. Если не выпущено, слишком много экземпляров MediaPlayer приведет к в исключении.

Обратите внимание, что, поскольку prepare () вызывается автоматически в этом методе, вы не может изменить идентификатор аудио сеанса (см. 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();
...