25

I'm developing a video application. After 1st video playback done, in the "OnCopletion" I'm trying to start a new one. But it just stops (not crashes) and do nothing. In the log:

10-19 09:44:49.056: ERROR/MediaPlayer(4654): setDataSource called in state 128 10-19 09:44:49.056: WARN/System.err(4654): java.lang.IllegalStateException 10-19 09:44:49.056: WARN/System.err(4654): at android.media.MediaPlayer.setDataSource(Native Method) 10-19 09:44:49.056: WARN/System.err(4654): at ru.osiris.BusAdvertising.BusAdvertisingActivity.onCompletion(BusAdvertisingActivity.java:1255) 10-19 09:44:49.056: WARN/System.err(4654): at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1304) 10-19 09:44:49.056: WARN/System.err(4654): at android.os.Handler.dispatchMessage(Handler.java:99) 10-19 09:44:49.056: WARN/System.err(4654): at android.os.Looper.loop(Looper.java:123) 10-19 09:44:49.056: WARN/System.err(4654): at android.app.ActivityThread.main(ActivityThread.java:4627) 10-19 09:44:49.056: WARN/System.err(4654): at java.lang.reflect.Method.invokeNative(Native Method) 10-19 09:44:49.056: WARN/System.err(4654): at java.lang.reflect.Method.invoke(Method.java:521) 10-19 09:44:49.056: WARN/System.err(4654): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 10-19 09:44:49.056: WARN/System.err(4654): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 10-19 09:44:49.056: WARN/System.err(4654): at dalvik.system.NativeStart.main(Native Method) 

what does it mean? How can I fix it? there is my code:

public class BusAdvertisingActivity extends Activity implements LocationListener, OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback { ... private MediaPlayer mMediaPlayer; private SurfaceView mPreview; private SurfaceHolder holder; private String path; private Bundle extras; @Override public void onCreate(Bundle icicle) { mPreview = (SurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); extras = getIntent().getExtras(); } public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated called"); playVideo(); } private void playVideo(Integer Media) { Log.d(TAG, "playVideo called"); doCleanUp(); try { File clip=new File(Environment.getExternalStorageDirectory(), playList[FLcurrentVideo].substring(2, playList[FLcurrentVideo].length()-1)+".mp4"); path = clip.getAbsolutePath(); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.e(TAG, "error: " + e.getMessage(), e); } } public void onCompletion(MediaPlayer arg0) { Log.d(TAG, "onCompletion called"); FLcurrentVideo++; File clip=new File(Environment.getExternalStorageDirectory(), playList[FLcurrentVideo].substring(2, playList[FLcurrentVideo].length()-1)+".mp4"); path = clip.getAbsolutePath(); try { Log.d ("111", path); arg0.setDataSource(clip.getAbsolutePath()); //I got exception here arg0.setDisplay(holder); arg0.prepare(); arg0.setOnBufferingUpdateListener(this); arg0.setOnCompletionListener(this); arg0.setOnPreparedListener(this); arg0.setOnVideoSizeChangedListener(this); arg0.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Please, help me.

2 Answers 2

118

If you see this state diagram (taken from https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram): enter image description here

You will realize that you should call reset() to get it back to the idle state. Only then can you call setDataSource()

Sign up to request clarification or add additional context in comments.

Comments

1

Android docs say about IllegalStateException:

Thrown when an action is attempted at a time when the VM is not in the correct state.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.