在我的Android应用中,我有一个播放来自网址的视频的mediaPlayer。我有一个用户想要关闭视频并返回上一个活动时选择的按钮。当用户当前点击该按钮时,应用程序崩溃并显示以下错误日志:
android.view.WindowLeaked: Activity com.bip.activities.MediaPreview has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42a50290 V.E..... R.....ID 0,0-800,117} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.widget.MediaController.show(MediaController.java:346)
at android.widget.MediaController.show(MediaController.java:306)
at com.bip.activities.MediaPreview$playUploadedVideo.onPostExecute(MediaPreview.java:834)
at com.bip.activities.MediaPreview$playUploadedVideo.onPostExecute(MediaPreview.java:1)
Shutting down VM
FATAL EXCEPTION: main
Process: com.bip.activities, PID: 26651
java.lang.NullPointerException at com.bip.activities.MediaPreview$playUploadedVideo.getCurrentPosition(MediaPreview.java:868)
at android.widget.MediaController.setProgress(MediaController.java:423)
at android.widget.MediaController.access$500(MediaController.java:71)
at android.widget.MediaController$3.handleMessage(MediaController.java:394)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
以下是我加载播放器的方法:
public class playUploadedVideo extends AsyncTask<String, Void, Boolean>
implements OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, MediaPlayerControl {
private ImageButton okay;
private MediaPlayer s3VideoPlayer;
...
s3VideoPlayer = MediaPlayer.create(this.context,
Uri.parse(arg0[0]));
s3VideoPlayer.setSurface(s);
s3VideoPlayer.setOnBufferingUpdateListener(this);
s3VideoPlayer.setOnCompletionListener(this);
s3VideoPlayer.setOnPreparedListener(this);
s3VideoPlayer.setScreenOnWhilePlaying(true);
s3VideoPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
okay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// stop mediaplayer if running
if(s3VideoPlayer != null){
try{
Log.d(TAG, "Stopping media player from okay button");
if(s3VideoPlayer.isPlaying()){
s3VideoPlayer.stop();
}
s3VideoPlayer.release();
s3VideoPlayer = null;
}catch(Exception ex){
ex.printStackTrace();
}
}
StepDisplay.setAlreadyLoaded(true);
Intent returnIntent = getIntent();
setResult(RESULT_CANCELED, returnIntent);
finish();
}
});
@Override
public void onStop() {
super.onStop();
if (s3VideoPlayer!=null){
try{
s3VideoPlayer.stop();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
我没有在我的代码中明确调用getCurrentPosition。有没有办法确保它没有被调用然后视频被释放?
如何在返回上一个活动之前摆脱nullPointerException / WindowLeak以成功关闭视频?
答案 0 :(得分:0)
当我关闭视频时,似乎隐藏了mediacontroller消除了这个问题。