Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AndroId MediaPlayer prepareAsync method

I have a strange problem. I use the prepareAsync method with the MediaPlayer, but the listener that I declared just never gets fired. I try to stream a live .mp3 feed from the Internet (radio station). I use an inline method for the listener, but I also tried implementing the interface without any success. Here's a portion of my code :

In the member section :

String url = "http://<my_url>.mp3";
MediaPlayer mediaPlayer = new MediaPlayer();

In Activity onCreate() :

ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
playButton.setOnClickListener(this);
playButton.clearFocus();
playButton.setClickable(false);

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
        playButton.setClickable(true);
        mp.start();
    }
});

preparePlayer();

Then, here's the preparePlayer() method :

private void preparePlayer() {
    if (mediaPlayer == null) {
        mediaPlayer = new MediaPlayer();
    }
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepareAsync();

    } catch (IllegalArgumentException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalArgument),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IllegalStateException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalState),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IOException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIO),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

And (just for the record), the onDetroy() where I do the cleaning :

private void releaseMediaPlayer() {
    if (mediaPlayer != null) {
        if(mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
}
like image 863
Patrice Cote Avatar asked Apr 24 '12 22:04

Patrice Cote


People also ask

What method is used to call media?

mediaPlayer. start(); mediaPlayer. pause(); On call to start() method, the music will start playing from the beginning.

Which method is used to bring the MediaPlayer to prepared state?

Once in the Stopped state, playback cannot be started until prepare() or prepareAsync() are called to set the MediaPlayer object to the Prepared state again.

How can I stop MediaPlayer in another activity?

You can't destroy one activity from another activity. But you can pause the media player by creating a new instance of MediaPlayer in the second activity and callind the 'stop' method !

Which of the following method of the MediaPlayer class uses the SurfaceHolder object to display video content?

The Media Player requires a SurfaceHolder object for displaying video content, assigned using the setDisplay() method. The Surface View is a wrapper around the Surface Holder object. Note that we must implement the SurfaceHoler. Callback interface.


2 Answers

Turned out, I forgot to mention the "@Override" on top of my inner method. Like this :

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
        playButton.setClickable(true);
        mp.start();
    }
});

Now everything works fine. Well... almost, since it takes forever to buffer...

like image 52
Patrice Cote Avatar answered Sep 20 '22 06:09

Patrice Cote


You are setting the OnPreparedListener in your Activity's create method and later on, possibly, creating a new MediaPlayer in your preparePlayer() method. Any newly created MediaPlayer's wont have the prepareListener set. You should also add an errorlistener to find out whats going on.

You may want to move the setOnPreparedListener call inside the

  if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
}

as well as setting a setOnErrorListener like so:

if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnErrorListener(....);
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
            playButton.setClickable(true);
            mp.start();
        }
    });
}

Please change e.printStackTrace(); to

Log.e("tag", e.getMessage(), e);  

Hope this helps, let us know if you have any log data as this will also be useful.

like image 25
petey Avatar answered Sep 22 '22 06:09

petey