I have the same problem and after a few hours I got a solution. I have done the following:
Summary
The Activity class implements the interfaces: MediaPlayer.OnPreparedListener and MediaController.MediaPlayerControl
OnCreate setContentView.
Onstart Create a MediaPlayer and MediaController, start the listener using the setOnPreparedListener method and the prepare () method for MediaPlayer.
Use the onPrepared method. Associate mediaController with mediaPlayer, launch mediaPlayer, and here the show () method is called with the handler only when we know that MediaPlayer is ready.
My code is :
public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaController.MediaPlayerControl { private static final String TAG = "AudioPlayer"; private MediaPlayer mediaPlayer; private MediaController mediaController; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { Log.d(TAG, "Play - onStart"); super.onStart(); mediaPlayer = new MediaPlayer(); mediaController = new MediaController(this); mediaPlayer.setOnPreparedListener(this); try { AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(R.raw.audio_example); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); mediaPlayer.prepare(); afd.close(); } catch (IOException e) { Log.e(TAG, "Error opening audio: " + e.getCause()); } } // override this method because of the OnPreparedListener interface @Override public void onPrepared(MediaPlayer mediaPlayer) { Log.d(TAG, "Play - onPrepared"); mediaController.setMediaPlayer(this); mediaController.setAnchorView(findViewById(R.id.mediaController1)); mediaPlayer.start(); handler.post(new Runnable() { @Override public void run() { mediaController.setEnabled(true); mediaController.show(0); } }); } // override these methods because of the MediaController.MediaPlayerControl interface @Override public boolean canPause() { return true; } @Override public boolean canSeekBackward() { return true; } @Override public boolean canSeekForward() { return true; } @Override public int getAudioSessionId() { // TODO Auto-generated method stub return 0; } @Override public int getBufferPercentage() { // TODO Auto-generated method stub return 0; } @Override public int getCurrentPosition() { return mediaPlayer.getCurrentPosition(); } @Override public int getDuration() { return mediaPlayer.getDuration(); } @Override public boolean isPlaying() { return mediaPlayer.isPlaying(); } @Override public void pause() { mediaPlayer.pause(); } @Override public void seekTo(int pos) { mediaPlayer.seekTo(pos); } @Override public void start() { mediaPlayer.start(); } // release resources before kill the Activity @Override protected void onStop() { Log.d(TAG, "Play - onStop"); super.onStop(); if (mediaPlayer != null) { mediaController.hide(); mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } }
source share