One Android MediaPlayer Object plays several sounds at once - android

I have ONE object MediaPlayer mediaplayer. I use it to play different sounds, one after another.
mediaplayer = MediaPlayer.create(context, ResIdMusicONE);
mediaplayer.start();
// some user input
mediaplayer.release();
mediaplayer = null;
// some other user input
mediaplayer = MediaPlayer.create(context, ResIdMusicTWO);
mediaplayer.start();
// some user input
mediaplayer.release();
mediaplayer = null;
Sometimes is works fine. But sometimes the two sounds are played at the same time. And at positions, where mediaplayer should already have been released and be equal null.
Thanks for the help.

If I were you I would use the SoundPool class for this. With SoundPool you can set the number of streams to play at the same time, so by setting that to 1 you can just call play() over and over and the most recent call to play() will be the only sound that you hear.
Take a look at my post a while back. It has an example of the SoundPool class in the question.
Edit:
Have you tried creating a new instance and calling the prepare() every time you want to start a new sound?
mediaplayer = new MediaPlayer();
mediaplayer.setDataSource(path);
mediaplayer.prepare();
mediaplayer.start();
Though actually now that I think about it, I'm pretty sure you only need to do that if you are using a file from the sdcard not from your resources... Hmmm.

Related

Android, MediaPlayer crashes after random amount of times

I have this simple bit of code which is executed everytime the NEXT button is being clicked:
mediaPlayer.Stop();
mediaPlayer.Release();
mediaPlayer = MediaPlayer.Create(this, uri);
btn_StartOrPause.SetImageResource(Resource.Drawable.btn_pause);
So the current song is now stopped and a new song with a new uri is being created. This works around 2 times in a row until the create line crashes saying only:
Java.Lang.IllegalStateException:
No content.
Am I using the player wrong? Why is it crashing sometimes after one successful click, sometimes straght away? The uri is always correct.
May you can use
mediaPlayer.stop()
mediaPlayer.reset()
and then use
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare();
Maybe release() can make the state of MediaPlayer Error.
After trying this out a gazillion times, it seems that THIS is the right syntax for ending one song and then recreating the other:
mediaPlayer.Stop();
mediaPlayer = MediaPlayer.Create(this, uri);
Note that my mediaPlayer is a static variable!
Thanks all!

Android MediaPlayer OnPreparedListener

I am working on a simple app and using a MediaPlayer to play some background noise in 1 activity. I am reading up on MediaPlayer and am not sure whether or not to implement an OnPreparedListener to trigger the start() method. What are the pros / cons to each approach?
Approach 1:
mediaPlayer = MediaPlayer.create(context, R.raw.sound);
mediaPlayer.setLooping(true);
mediaPlayer.start();
Approach 2:
mediaPlayer = MediaPlayer.create(context, R.raw.sound);
mediaPlayer.setLooping(true);
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
#Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
As per the docs, calling start() is effective when you are playing locally available resources for which the MediaPlayer does not require to fetch the data and process it for playing. For example playing audio resources from raw folder.
If you are trying to play a resource from remote source, its a better practice to go for OnPreparedListener() because it might involve fetching and decoding media data.
So, if you know for sure, that your resource is locally available and is of short length, go for Approach 1. Otherwise Approach 2 would be suitable.
Ideally, I prefer this.
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
#Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
The MediaPlayer has always been tricky for me to work with. So, I would recommend you to start with the developer docs. Go through it, understand the state diagram. I am sure it will help you in solving lot of questions which you are yet to come across.
Let's say you are playing a video from internet. If you start directly the player it would crash because it may be not ready to play because of some internet problems or something else. But if you use preparedlistener then it will not start the player until it is ready to play.
Therefore it is good to have onpreparedlistener so your activity does not crash or misbehaves.

sounds not playing with mediaplayer after playing some sounds

I'm developing an android application which is collection of 100 sound effects.
After I play for instance 25 of the sounds, I can't play anymore and I have to close the application and wait for some minutes then open the application and now I can play other sounds.
final MediaPlayer mp81 = MediaPlayer.create(MainActivity.this, R.raw.a81);
I play the sound using the below code:
mp81.start();
I stop the playing sound using the below code:
mp81.seekTo(0);
I also used stop() method but the problem were still existing.
is there any other method i have to add?
Please note: consider using SoundPool for playing short sounds.
Regarding your use-case: you initialize your MediaPlayer instance using the static create() method which means you create a new MediaPlayer object for each sound instead of reusing an existing instance and just changing the data source. This might negatively affect the performance of your app. I suggest that you create an array of paths to your sounds and then instantiate the MediaPlayer like this:
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource(yourArray[x]);
mp.prepare();
mp.start();
} catch(Exception e){
e.printStackTrace();
}
Consult the MediaPlayer Document for more information.

Android : how to play multiple audios using single media player object

I need to create only one media player object Mediaplayer mp = new Mediaplayer();
Using this I need to play multiple audio files one after the other for that i am using handler
and getting the duration.
If i create multiple media player objects it shows error(1, -17)
I also need to display images related to audio files.
Did you rule out SoundPool?
http://developer.android.com/reference/android/media/SoundPool.html
It typically good for short audio clips.
Implement the OnCompletionListener and register it with your MediaPlayer instance.
After the media has been played out it will call this callback method onCompletion
void onCompletion(MediaPlayer mp){
//Here you stop it.
mp.stop();
//Reset the data source path to the new file
mp.setDataSource(<uri>);
mp.prepare(); // or mp.prepareAsync();
// start the mediaplayer after the prepare has completed.
}
Release the mediaplayer instance once you are done playing all the files.

Implement sounds in an android application

I am developing a game application in android. I have designed all the views and implemented all the functionality. Now in the last screen I have to play sounds in android. Can anybody tell me how to pursue with it?
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.AudioFile1);
mp.start();
And then you get all the start/stop/reset/pause/release methods from mp.
Just place the sound file in /res/raw (after creating the folder) and then use MediaPlayer to init, start and then stop playing the sound. MediaPlayer documentation can be found here.
HTH,
Sriram.
I would suggest SoundPool for seamless playback in android because
mediaPlayer first loads the whole sound data in memory than play, so it produces some lag when we switch among sounds frequently.
SoundPool is a better option with small size sound file, and produces best result with .ogg media file.
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
}
});
soundID = soundPool.load(this, R.raw.sound, 1);
if (loaded) {
soundPool.play(soundID, volume, volume, 1, 0, 1f);
}
From Android Developer page: http://developer.android.com/guide/topics/media/index.html
Playing from a Raw Resource Perhaps
the most common thing to want to do is
play back media (notably sound) within
your own applications. Doing this is
easy:
Put the sound (or other media
resource) file into the res/raw folder
of your project, where the Eclipse
plugin (or aapt) will find it and make
it into a resource that can be
referenced from your R class Create an
instance of MediaPlayer, referencing
that resource using
MediaPlayer.create, and then call
start() on the instance:
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
mp.start();
To stop playback, call stop().
If you wish to later replay
the media, then you must reset() and
prepare() the MediaPlayer object
before calling start() again.
(create() calls prepare() the first
time.)
To pause playback, call pause().
Resume playback from where you paused
with start().
Playing from a File or Stream You can
play back media files from the
filesystem or a web URL:
Create an instance of the MediaPlayer
using new Call setDataSource() with a
String containing the path (local
filesystem or URL) to the file you
want to play First prepare() then
start() on the instance:
Like this
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();
By using Media Player you can achieve this.
here is the steps::
1.- Create a new folder called "raw" inside "debug" folder. To create it right clic on "debug" folder > new > directory > and in name it "raw" :
To add files just drag the .wav/.mp3 files to "raw" folder.
2.- Import media player:
import android.media.MediaPlayer;
3.- Declare MediaPlayer global variable(s):
public MediaPlayer mp1;
4.- Inside onCreate method, asign the corresponding sounds:
mp1 = MediaPlayer.create(MainActivity.this, raw.my_sound_name);
5.- Finally, you can use methods...
mp1.start() / mp1.stop() / mp1.pause()

Categories

Resources