Android MediaPlayer - как играть в STREAM_ALARM? - PullRequest
12 голосов
/ 14 августа 2011

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

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 в свой манифест.

Спасибо!

Ответы [ 5 ]

25 голосов
/ 30 ноября 2011

Я не знаю, почему это произойдет, однако приведенный ниже код работает.Вы должны установить источник данных с 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();
6 голосов
/ 04 января 2017

Проблема в том, что вы используете 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();

См. эту ссылку для получения дополнительной информации.

2 голосов
/ 17 июля 2013

1. setAudioStreamType (int streamtype)

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

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

В случае успеха, prepare () уже вызван и не должен вызываться снова.

0 голосов
/ 15 июня 2018

Решение здесь устарело в API 22 * ​​1001 *

Я открыл собственную ветку , чтобы понять это.

Вот обновленное рабочее решение.

mediaPlayerScan = new MediaPlayer();
try {
  mediaPlayerScan.setDataSource(getContext(),
          Uri.parse(getString(R.string.res_path) + R.raw.scan_beep));

  if (Build.VERSION.SDK_INT >= 21) {
    mediaPlayerScan.setAudioAttributes(new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_ALARM)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build());
  } else {
    mediaPlayerScan.setAudioStreamType(AudioManager.STREAM_ALARM);
  }
  mediaPlayerScan.prepare();
} catch (IOException e) {
  e.printStackTrace();
}
0 голосов
/ 14 августа 2011

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

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

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

Надеюсь, это помогло

...