AndroId MediaPlayer prepareAsync method
android, android-mediaplayer, asynchronous, prepare
Solution
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.
Problem
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(); } ```