我正在使用videoView和mediaplayer,但在onPause和onResume中停止mediaplayer给了我错误:
static MediaPlayer mediaPlayer;
private VideoViewCustom videoView;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detailvideo);
context = this;
videoView = (VideoViewCustom) findViewById(R.id.videoplayer);
//initialize media player
mediaPlayer = new MediaPlayer();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// Close the progress bar and play the video
public void onPrepared(MediaPlayer mp) {
Log.d(TAG,"setOnPreparedListener");
mediaPlayer = mp;
int timeDuration = 0;
boolean videoPlaying = false;
if(savedInstanceState != null) {
Log.d(TAG,"savedInstanceState != null");
timeDuration = savedInstanceState.getInt("timeduration");
videoPlaying = savedInstanceState.getBoolean("videoPlaying");
Log.d(TAG, "timeDuration saved:" + timeDuration);
Log.d(TAG, "videoPlaying saved:" + videoPlaying);
Log.d(TAG,"video position:"+videoView.getCurrentPosition());
if (videoPlaying) {
videoView.seekTo(timeDuration);
mediaPlayer.start();
videoView.start();
} else {
videoView.seekTo(timeDuration);
}
}
else
{
Log.d(TAG, "savedInstanceState == null");
mediaPlayer.start();
videoView.start();
}
finalTime = videoView.getDuration();
Log.d(TAG, "mp.getCurrentPosition():" + videoView.getCurrentPosition());
Date d = new Date(videoView.getCurrentPosition());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String time = sdf.format(d).toString();
Log.d(TAG, "time:" + time);
videoSeekBar.setProgress(timeDuration);
videoSeekBar.setMax(finalTime);
durationHandler.postDelayed(updateSeekBarTime,1000);
}
});
}
@Override
public void onResume() {
super.onResume();
// Setup the player
videoView.resume();
}
@Override
public void onPause()
{
if(mediaPlayer != null)
{
mediaPlayer.stop();
}
super.onPause();
}
@Override
public void onDestroy() {
if(mediaPlayer != null) {
mediaPlayer.release();
}
super.onDestroy();
}
backArrowImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer != null)
{
mediaPlayer.stop();
mediaPlayer.release();
}
finish();
}
});
}
一旦我按下backArrowImageView按钮,我已经在上面写了代码,我的应用程序崩溃了,给我这个logcat:
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._stop(Native Method)
at android.media.MediaPlayer.stop(MediaPlayer.java:1561)
at com.ui.VideoDetailActivity.onPause(VideoDetailActivity.java:493)
at android.app.Activity.performPause(Activity.java:5686)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1239)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3400)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3369)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3347)
at android.app.ActivityThread.access$1100(ActivityThread.java:171)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5679)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
VideoDetailActivity.java:493 contains:
mediaPlayer.stop(); inside onPause method ?
根据Android文档:
"IllegalStateException,如果内部播放器引擎没有已初始化或已释放。"
所以确保你的MediaPlayer是初始化的,你不使用释放的那个。在onPause()和onDestroy()中使用如下方法,
try{
if(mediaPlayer !=null && mediaPlayer.isPlaying()){
Log.d("TAG------->", "player is running");
mediaPlayer.stop();
Log.d("Tag------->", "player is stopped");
mediaPlayer.release();
Log.d("TAG------->", "player is released");
}
}catch(Exception e){
}
根据官方文档,您必须避免在MediaPlayer的IDLE
, INITIALIZED
或ERROR
状态下调用stop()
。
release()
和reset()
API可以在MediaPlayer的任何状态下调用。
不幸的是,要找出当前状态,你必须自己跟踪它(没有API)。在我的一个项目中,我创建了一个扩展MediaPlayer的类,并通过重写一些MediaPlayer API来跟踪它的当前状态,这样我就可以在调用任何API之前轻松检查当前状态。如果你在不正确的状态下调用API,通常状态更改为ERROR
,你必须再次重新初始化媒体播放器来修复它。
尝试使用这个…你需要检查是否为空,你不能停止一个非播放媒体,所以在你释放或停止
之前也检查播放 @Override
public void onPause()
{
if(mediaPlayer != null && mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
super.onPause();
}
在释放媒体播放器之前。使用这行代码
mVideoView.setVisibility(View.GONE);
这里有一个例子
try{
video.setVisibility(View.GONE);
mp.reset();
mp.release();
mp = null;
}catch(Exception e){
Log.d("Releasing mp", e.toString());
}