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.
An IllegalStateException is an unchecked exception in Java. This exception may arise in our java program mostly if we are dealing with the collection framework of java. util.
This is Thrown if an application tries to access or modify a specified field of an object, and that object no longer has that field. This is Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method.
Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. You should look into one of your thread and make it synchronized with your UI thread. The way to do this in Android is with Handler.
If you see this state diagram (taken from https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram):
You will realize that you should call reset()
to get it back to the idle state. Only then can you call setDataSource()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With