AbhiRam
AbhiRam

Reputation: 2061

How to start MediaPlayer after it has been stopped in android

I am new to Android and in my app I am working with MediaPlayer.

When I first tap the start button, the song plays, but when I tap the stop button and then I tap on the start button again, the song does not start playing again. Here's what I have so far:

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);

        final MediaPlayer mp = new MediaPlayer();

        try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
            mp.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.pause();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
            }
        });
    }
}

Upvotes: 1

Views: 2465

Answers (8)

g-hos
g-hos

Reputation: 117

@MRodrigues was right about media player states. But instead of calling release() after stop, Modify your code as below.

Currently,

try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
            mp.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });

modify to,

try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mp.isPlaying()) {
                    mp.prepare();
                }
                mp.start();
            }
        });

Upvotes: 0

ddb
ddb

Reputation: 2435

SOLUTION 1

for this solution, I took some info from here

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;
    MediaPlayer mp;
    /**
     * remain false till media is not completed, inside OnCompletionListener make it true.
     */
    private boolean initialStage = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (initialStage) {
                    mp = new MediaPlayer();
                    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    new Player()
                            .execute("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
                } else {
                    if (mp && !mp.isPlaying())
                        mp.start();
                }
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp && mp.isPlaying())
                    mp.pause();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.stop();
                    mp.release();
                    mp = null;
                    initialStage = true;
                }
            }
        });
    }

    /**
     * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
     * @author piyush
     *
     */

    class Player extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog progress;

        @Override
        protected Boolean doInBackground(String... params) {
            // TODO Auto-generated method stub
            Boolean prepared;
            try {

                mp.setDataSource(params[0]);

                mp.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    initialStage = true;
                    mp.stop();
                    mp.reset();
                }
            }); 
            mp.prepare();
            prepared = true;
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                Log.d("IllegarArgument", e.getMessage());
                prepared = false;
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                prepared = false;   
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                prepared = false;
                e.printStackTrace();
            }
            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (progress.isShowing()) {
                progress.cancel();
            }
            Log.d("Prepared", "//" + result);
            mp.start();

            initialStage = false;
        }

        public Player() {
            progress = new ProgressDialog(PlayngUrlFiles.this);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            this.progress.setMessage("Buffering...");
            this.progress.show();

        }
    }

}

SOLUTION 2

in order to avoid data downloding, try this

public class PlayngUrlFiles extends AppCompatActivity {

    Button start, pause, stop;
    boolean prepared;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingurls_layout);

        start = (Button) findViewById(R.id.button1);
        pause = (Button) findViewById(R.id.button2);
        stop = (Button) findViewById(R.id.button3);
        final MediaPlayer mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        prepared = false;

        mp.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                prepared = true;
                mp.start();
            }
        });

        try {
            mp.setDataSource("http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3");
        } catch (Exception e) {
            e.printStackTrace();
        }

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    try {
                        if(!prepared) {
                            mp.prepareAsync();
                            prepared = true;
                        } else {
                            mp.start();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.pause();
                }
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mp) {
                    mp.stop();
                    prepared = false;
                }
            }
        });
    }
}

Upvotes: 0

user5439728
user5439728

Reputation:

This code may help you..

 @Override
    protected void onDestroy() {
        super.onDestroy();
        destroyMediaPlayer();
    }

    private void destroyMediaPlayer() {
        if (mediaPlayer != null) {
            try {

                mediaPlayer.release();
                Log.d("here", "destroy");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } 

Upvotes: 0

Vanya Sakharovskiy
Vanya Sakharovskiy

Reputation: 295

Here is code to set sound file.

if (mPlayer != null) {
     mPlayer.stop();
     mPlayer.release();
}
mPlayer = new MediaPlayer();
AppLog.d("Created new Media player");
try {
     mPlayer.setDataSource(fileName);
} catch (IOException e) {
     AppLog.e("Can't open " + fileName + " file", e);
}

Before playing u should call the mPlayer.prepareAsync() function. if you want to pause/play you have to use this code:

if (mediaPlayer.isPlaying()){
    mediaPlayer.pause();
} else {
    mediaPlayer.start();
}

If you want to stop player use this:

if (mPlayer != null){
    mPlayer.stop();
    mPlayer.release();
}
mPlayer = null;

If you want to start song again use first functions and next with this steps

Upvotes: 0

Yagami Light
Yagami Light

Reputation: 1796

try this

public void onStopBtnClick(View view) {
    if (mAudioHelper != null) {
        mAudioHelper.stop();
        displayMessage("Stopping!");
    }
}

Upvotes: 0

MRodrigues
MRodrigues

Reputation: 2045

You can not call start, it media player in on stop state. Take a look on the state diagram of media player MediaPlayer state diagram.

When you call stop, you have to call release(), and with start you get a new media player, or just call reset.

Upvotes: 0

Lubomir Babev
Lubomir Babev

Reputation: 1908

Try this :

stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                }
            }
        });

Upvotes: 1

Aditya Vyas-Lakhan
Aditya Vyas-Lakhan

Reputation: 13555

just check like this way

if(mdpl.isPlaying()){
    mdpl.pause();
} else {
    mdpl.start();
}

Upvotes: 0

Related Questions