java.lang.IllegalStateException 是什么意思?
我正在开发一个视频应用程序。第一个视频播放完成后,在“OnCopletion”中,我尝试开始一个新的视频。但它只是停止(而不是崩溃)并且什么也不做。日志中:
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)
这是什么意思?我该如何修复它? 这是我的代码:
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();
}
}
请帮助我。
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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您看到此状态图(取自 https://developer.android. com/reference/android/media/MediaPlayer.html#StateDiagram):
你会意识到你应该打电话给
reset()
将其恢复到空闲状态。只有这样你才能调用setDataSource()
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 callsetDataSource()
Android 文档关于 IllegalStateException 的说法:
Android docs say about IllegalStateException: