释放媒体播放器并将其停止 onPause 和 onResume 在 Android 中给出错误

Releasing mediaplayer and stopping it onPause and onResume gives error in 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.access00(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 ?

尝试使用此...您需要检查 null 并且您无法停止非播放媒体,因此在释放或停止之前也检查播放

    @Override
    public void onPause()
    {
        if(mediaPlayer != null && mediaPlayer.isPlaying())
        {
            mediaPlayer.stop();
        }
        super.onPause();
    }

根据 official documentation,您必须避免在 MediaPlayer 的 IDLEINITIALIZEDERROR 状态下调用 stop()

release()reset()API可以在MediaPlayer的任何状态下调用。

不幸的是,要找出当前状态,您必须自己跟踪它(没有 API)。在我的一个项目中,我创建了 class,它扩展了 MediaPlayer 并通过覆盖一些 MediaPlayer API 跟踪它的当前状态,所以我可以在调用任何 API 之前轻松检查当前状态。如果您在不正确的状态下调用 API,通常状态会更改为 ERROR,您必须再次重新初始化媒体播放器才能修复它。

根据 Android 文档:

"IllegalStateException if the internal player engine has not been initialized or has been released."

因此请确保您的 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){
}

在释放媒体播放器之前。使用这行代码

mVideoView.setVisibility(View.GONE);

举个例子。

try{
    video.setVisibility(View.GONE);
    mp.reset();
    mp.release();
    mp = null;                       
    }catch(Exception e){
    Log.d("Releasing mp", e.toString());
    }