android - with - java.lang.IllegalStateException ¿qué significa?
theme.appcompat dark (2)
Estoy desarrollando una aplicación de video. Después de la primera reproducción de video, en "OnCopletion" estoy tratando de comenzar uno nuevo. Pero simplemente se detiene (no se estrella) y no hace nada. En el registro:
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)
¿Qué significa eso? ¿Cómo puedo arreglarlo? ahí está mi código
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();
}
}
Por favor, ayúdame.
Los documentos de Android dicen acerca de IllegalStateException :
Se lanza cuando se intenta una acción en un momento en que la máquina virtual no está en el estado correcto.
Si ve este diagrama de estado (tomado de https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram ):
Se dará cuenta de que debe llamar a reset()
para volver al estado inactivo. Solo entonces puedes llamar a setDataSource()