Android MediaPlayer - как играть в STREAM_ALARM?

Я попытался настроить аудиопоток медиаплеера в своем приложении, используя следующий код, но когда я это делаю, я не слышу звук в эмуляторе. Если я не устанавливаю поток для проигрывателя, звук воспроизводится нормально. Я уверен, что использую это неправильно, но не могу тренироваться, как любая помощь?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio);

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.start();

Примечание. Я уже добавил разрешение MODIFY_AUDIO_SETTINGS для моего манифеста.

Спасибо!

Ответ 1

Я не знаю, почему это произойдет, однако приведенный ниже код работает. Вы должны установить источник данных с помощью setDataSource() вместо create().

Этот код работает:

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setDataSource(this,Uri.parse("android.resource://PACKAGE_NAME/"+R.raw.soundfile));
mp.prepare();
mp.start();

Этот код не работает:

MediaPlayer mp = MediaPlayer.create(this, R.raw.soundfile);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.prepare();
mp.start();

Ответ 2

Проблема заключается в том, что вы используете MediaPlayer.create() для создания MediaPlayer. Функция Create вызывает функцию prepare(), которая завершает работу вашего носителя и не позволяет вам изменять AudioStreamType.

Решение использует setDataSource вместо Create:

MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
try {
   mp.setDataSource(getApplicationContext(), yourAudioUri);
   mp.prepare();
} catch (IOException e) {
   e.printStackTrace();
}
mp.start();

Подробнее см. эту ссылку.

Ответ 3

1. setAudioStreamType (int streamtype)

Должен вызывать этот метод перед тем, как подготовить();

2. MediaPlayer.create(контекст контекста, int остаток)

При успехе, prepare() уже был вызван и не должен быть вызван снова.

Ответ 4

Попробуйте следующее:

player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.prepare();
player.start();

И почему вы вызываете "audioManager.getStreamVolume(AudioManager.STREAM_ALARM);"? Значение не сохраняется в переменной, поэтому оно бесполезно;)

Я надеюсь, что это помогло