释放媒体播放器并将其停止 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 的 IDLE
、INITIALIZED
或 ERROR
状态下调用 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());
}
我正在使用 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 的 IDLE
、INITIALIZED
或 ERROR
状态下调用 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());
}