Android MediaPlayer - how to play in the STREAM_ALARM?
Solution 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();
Solution 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.
Solution 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.
Solution 4
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();
}
James
Updated on June 16, 2022Comments
-
James about 2 years
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!
-
James almost 13 yearsI tried it with player.prepare() but it didn't make any difference. Still no audio played. I was storing the the stream volume to a variable which is used later in my app, I took out the assignment temporarily to help with debugging.
-
Amir Hossein Ghasemi almost 8 yearsbetter to write the uri like:
Uri.parse("android.resource://"+mContext.getPackageName()+"/"+R.raw.sound)
-
Tsar Ioann over 2 yearsFound a simplier way (for SDK >= 21):
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.<sound>, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build(), audioManager.generateAudioSessionId());