释放媒体播放器和停止它onPause和onResume在Android给出错误



我正在使用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, INITIALIZEDERROR状态下调用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());
    }

最新更新