How can I stop or pause MediaPlayer using only 1 media player?
For example I have Grid View. What I want when I click on button it's playing sound.
But here is tricky part. When I click again on button, its not stopping it but instead it's resting sound and playing it from start.
I tried to add
else{
mp.pause
mp.seekTo(0);
}
But it didn't work. It gave me errors
Here is my Code:
case 24:
if(mp!=null)
{
mp.release();
mp=null;
}
mp = MediaPlayer.create(Glavni.this, R.raw.s25snd);
mp.start();
break;
You should be able to pause the track
Mediaplayer.pause();
length=Mediaplayer.getCurrentPosition();
save length and than resume it with that length
Mediaplayer.seekTo(length);
Mediaplayer.start();
You need something like this:
if (mp == null) {
initMediaPlayer();
}
...
if (mPrepared && mHasStarted && mp.isPlaying()) {
mp.pause();
} else if (mPrepared) {
mHasStarted = true;
mp.start();
}
Where mPrepared is true once the media player has been prepared. If you look really closely at the state diagram and table, you'll notice it's an error to call pause() before the playback has been started. If this is indeed intentional, then you need the mHasStarted flag as well.
Related
I am developing a music player on android and the app has two activities (MainActivity and PlayActivity). In the MainActivity I have a listview with a list of songs and in the PlayActivity I have a button to listen and pause the music. The problem is that when go back to MainActivity and I select a new song from the listview, the first one keeps playing on background while the second one also starts playing. How can I stop the first song when I select a new one?
(I don't want to stop mediaplayer onBackPressed, I just want to stop the music when another song it's selected from listview and play a fresh song in PlayActivity)
EDIT: I'm using AsyncTask to start mediaplayer on PlayActivity: mp.prepareAsync();
You could try to stop MediaPlayer when onBackPressed()
MediaPlayer mp ; // mp is your MediaPlayer
#Override
public void onBackPressed() {
if (mp != null) {
mp.stop();
mp.release();
mp = null;
}
super.onBackPressed();
}
private void playMusic() {
if (mp != null) {
if (mp.isPlaying()) {
mp.stop();
mp.release();
MediaPlayer copyMp = new MediaPlayer();
try {
copyMp.setDataSource("/path");
mp = copyMp;
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
From here
MediaPlayer is not thread-safe. Creation of and all access to player
instances should be on the same thread.
That means you have to maintain one media player instance throughout your whole application(As per your requirement). I don't know how you implemented the media player(Service/AsyncTask etc.). When you select a new song, you need to access that instance and replace the existing song with the selected one.
on clicking the play button if music is playing the music should pause and image of button should change to pause button and vice versa
I dont know whats wrong with the logic please check.
public void onClick(View v) {
switch (v.getId())
{
case R.id.mpPlay: // bPlay
if(!mediaPlayer.isPlaying())
{
mediaPlayer.start();
bPlay.setBackgroundResource(R.drawable.play);
}
if(mediaPlayer.isPlaying())
{
mediaPlayer.pause();
bPlay.setBackgroundResource(R.drawable.pause);
}
break;
}
Try to use
setImageResource(id);
or
setImageDrawable(ContextCompat.getDrawable(context, id));
You should replace your second "if" statement with an "else". When your code is executed, the media player is not playing so your first "if" statement gets executed. This turns on your media playback. However, when your code gets to your second "if" statement, your media will be playing, so it immediately turns back off. Replacing your second "if" statement with an "else" will ensure that only one of the options (turn media playback on or turn media playback off) will be executed on any given onClick().
if(!mediaPlayer.isPlaying())
{
mediaPlayer.start();
bPlay.setBackgroundResource(R.drawable.play);
}
else
{
mediaPlayer.pause();
bPlay.setBackgroundResource(R.drawable.pause);
}
As I understood
ImageButton bPlay = (ImageButton)findViewById(R.id.mpPlay);
//mpPlay is id of your ImageButton for play button in xml file
is Ok.
So, try this:
public void onClick(View v){
switch (v.getId()){
case R.id.mpPlay:
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
bPlay.setImageResource(R.drawable.pause);
//pause icon during player plaing
} else if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
bPlay.setImageResource(R.drawable.play);
//play icon during player on pause
}
break;
}
}
In some way, it's logically
This question already has answers here:
Media Player start stop start
(8 answers)
Closed 6 years ago.
I have a button when clicked it plays an audio, and while it is playing I can pause it and replay it again and so forth. I have a shake event, where I want to play the audio on shake and replay it when device is shaken again (by first stopping the audio, calling stopAudio?)
I have the following code:
llBtn = (LinearLayout) findViewById(R.id.button);
llBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//Toast.makeText(MainActivity.this, "LL WAS CLICKED", Toast.LENGTH_SHORT).show();
//IF AUDIO IS NOT PLAYING... PLAY AUDIO
if (tvPS.getText() == "Stop Phrase!") {
StopAudio();
}
else {
PlayAudio();
}
}
});
//the same button is clicked to stop, it is currently setting to Pause.
public void StopAudio() {
mediaPlayer.pause();
Toast.makeText(MainActivity.this, "STOPPED", Toast.LENGTH_SHORT).show();
tvPS.setText("Play Phrase!");
}
public void PlayAudio() {
//stopPlaying(mediaPlayer);
tvPS.setText("Stop Phrase!");
inResId = getResources().getIdentifier("play" , "raw", getPackageName());
mediaPlayer = MediaPlayer.create(getBaseContext(), inResId);
mediaPlayer.seekTo(0);
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
#Override
public void onCompletion(MediaPlayer mp) {
//Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_SHORT).show();
tvPS.setText("Play Phrase!");
mediaPlayer.pause();
}
});
}
...
public void onShake() {
// Do stuff!
Toast.makeText(getBaseContext(), "Motion detected",
Toast.LENGTH_SHORT).show();
if (mediaPlayer == null) {
PlayAudio();
}
}
How can I modify the code above to handle Play, and then stop if stopped in the middle and then able to replay it again.
The button click works but I am creating a new instance each time and not recycling. When the device is shaken, it plays the audio twice instead of just once.
First of all create the MediaPlayer in onCreate of the context and not in some listener, and don't forget to release it when done, since it consumes a lot of resources,
mediaPlayer.release();
mediaPlayer = null;
Next thing, stop the audio using the stop() function instead of the pause() on completion of the song.
Steps
If you are using a service/activity to play a video create a MediaPlayer instance before it's usage begins, likely in onCreate.
Later use that instance to play/pause/stop the media.
In the onStop of the Service/Activity release the MediaPlayer instance.
Update your playMusic() function to use the MediaPlayer instance you just created, also in the listener use stop() instead of pause()
To change track of an existing MediaPlayer instance
You can use this:
String path = getExternalFilesDir(null).toString()+"/";
mMediaPlayer.setDataSource(path + mediafile);
Link: Changing data source for audio playback using existing MediaPlayer?
I am trying to play two sound items, one after the other
MediaPlayer mp = null;
protected void produceErrorSound(int index) {
if (mp != null) {
mp.reset();
mp.release();
}
mp = MediaPlayer.create(this, index);
mp.start();
}
public void correctAnswerAndNext(){
produceErrorSound(R.raw.right1) ;
produceErrorSound(R.raw.right1) ;
}
but only second sound is produced.
is there any alternative approach?
I can't see any wait mechanism in your code.
You can use an onCompletionListener to receive a callback when your first MediaPlayer has finished playback. At that point you can start the second MediaPlayer.
An alternative way in Jellybean (and later versions) is to use the audio chaining functionality (i.e. setNextMediaPlayer) to automatically start another MediaPlayer as soon as the current one has finished playing. Something like this (I've omitted the calls to setDataSource etc for brevity):
mediaPlayer1.prepare();
mediaPlayer2.prepare();
mediaPlayer1.start();
mediaPlayer1.setNextMediaPlayer(mediaPlayer2);
It now plays on first press, stops on second press or press of another sound button. If I let a sound play through I can restart it or play another sound on a single press.
My goal is for the second press of the same button to stop it, but the press of a new button to just start the new sound instead of first press of new button stopping the old sound, second press starting the new sound.
I can see why it does what it does now but am not sure how to make it work the way I want.
public void playSound(int input){
if (mp!=null && mp.isPlaying()) {
mp.stop();
mp.reset();
} else{
if (mp!=null){
mp.reset();
mp.release();
}
mp = MediaPlayer.create(Soundboard.this, input);
mp.start();
}
}
This block of code:
if (mp!=null){
mp.reset();
mp.release();
}
will never be executed. mp can only be null at this point, as it is in the else block of an if (mp != null) test. This suggests that there is a flaw in your thinking regarding the use of this method.
If a sound has played through and you press the button, then this code will execute:
mp.release();
mp = null;
Since mp was not null, the else block doesn't execute and no new sound is played. When the button is pressed a second time, mp is now null and the else block gets executed, creating a new MediaPlayer and playing the sound.