简体   繁体   English

NullPointerException与Android MediaPlayer

[英]NullPointerException with Android MediaPlayer

In my Android app, I have a mediaPlayer that plays a video from a URL. 在我的Android应用中,我有一个mediaPlayer,它可以播放来自URL的视频。 I have a button that the user selects when they want to close out the video and return to the previous activity. 我有一个按钮,供用户在要关闭视频并返回上一个活动时选择。 When the user clicks on the button currently, the app crashes with the following error log: 当用户当前单击按钮时,应用程序崩溃并显示以下错误日志:

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)

Here is how I load the player: 这是我加载播放器的方式:

 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();
            }
    }
}

I don't explicitly call getCurrentPosition in my code. 我没有在代码中显式调用getCurrentPosition。 Is there way to ensure it doesn't get called then the video is released? 有没有办法确保在视频发布后不会被调用?

How do I get rid of the nullPointerException / WindowLeak to successfully close out the video before returning to the previous activity? 在返回上一个活动之前,如何摆脱nullPointerException / WindowLeak成功关闭视频?

当我关闭视频时,好像隐藏了mediacontroller消除了问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM