Android MediaPlayer - how to play in the STREAM_ALARM?

旧城冷巷雨未停 提交于 2019-12-18 04:01:54

问题


I've tried settings the audio stream of the media player in my application using the following code but when I do this I hear no sound in the emulator. If I don't set the stream for the player then the audio plays fine. I'm sure I'm using this wrong but cannot workout how, any help?

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

Note: I've added the MODIFY_AUDIO_SETTINGS permission to my manifest already.

Thanks!


回答1:


I don't know why this would happen, however the code below works. You should set the data source with setDataSource() instead of with create().

This code works:

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

This code doesn't work:

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



回答2:


The issue is you are using MediaPlayer.create() to create your MediaPlayer. Create function calls the prepare() function which finalize your media and does not allow you to change AudioStreamType.

The solution is using setDataSource instead of 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();

See this link for more information.




回答3:


1. setAudioStreamType(int streamtype)

Must call this method before prepare() ;

2. MediaPlayer.create(Context context, int resid)

On success, prepare() will already have been called and must not be called again.




回答4:


Try the following:

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

And why are you calling "audioManager.getStreamVolume(AudioManager.STREAM_ALARM);"? The value isn't stored in a variable, so it is rather useless ;)

I hope that helped




回答5:


The solution here was deprecated in API 22

I opened my own thread to figure this out.

Here is an updated working solution.

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


来源:https://stackoverflow.com/questions/7057115/android-mediaplayer-how-to-play-in-the-stream-alarm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!