1

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();
            }
        });
    }
}
andyvn22
  • 14,696
  • 1
  • 52
  • 74
AbhiRam
  • 2,033
  • 7
  • 41
  • 94
  • http://stackoverflow.com/questions/34592596/getting-illegalstateexception-in-mediaplayer-when-trying-to-getcurrentposition/34604404#34604404 hey you can try this .. it may help you – MPG Jul 15 '16 at 09:23
  • Did you try what I suggested? – g-hos Jul 21 '16 at 02:07
  • So many people tried to help. Better to mark if something solved your problem. Give an update on what happened. – g-hos Jul 27 '16 at 03:06

8 Answers8

1

Try this :

stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                }
            }
        });
Lubomir Babev
  • 1,892
  • 1
  • 12
  • 14
0

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;
                }
            }
        });
    }
}
Community
  • 1
  • 1
ddb
  • 2,423
  • 7
  • 28
  • 38
0

just check like this way

if(mdpl.isPlaying()){
    mdpl.pause();
} else {
    mdpl.start();
}
Aditya Vyas-Lakhan
  • 13,409
  • 16
  • 61
  • 96
0

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.

MRodrigues
  • 1,927
  • 1
  • 17
  • 22
0

try this

public void onStopBtnClick(View view) {
    if (mAudioHelper != null) {
        mAudioHelper.stop();
        displayMessage("Stopping!");
    }
}
Yagami Light
  • 1,756
  • 4
  • 19
  • 39
0

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

Vanya Sakharovskiy
  • 295
  • 1
  • 3
  • 16
  • I am fully confused with ur code and very beginner in android please provide ur solution with editing my answer – AbhiRam Jul 15 '16 at 09:36
0

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

@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();
            }
        });
g-hos
  • 117
  • 1
  • 7