使用Android MediaPlayer的NullPointerException

时间:2014-08-09 20:41:23

标签: android nullpointerexception android-mediaplayer

在我的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以成功关闭视频?

1 个答案:

答案 0 :(得分:0)

当我关闭视频时,似乎隐藏了mediacontroller消除了这个问题。