You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中VideoView的MediaController暂停视频时应用崩溃问题

VideoView点击MediaController暂停按钮崩溃问题排查与解决

问题现象

使用VideoView播放视频时,点击MediaController的暂停按钮触发空指针崩溃,错误信息如下:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference

堆栈追踪指向DecorView.dispatchTouchEvent方法。

涉事代码

Uri uri = Uri.parse(videoUrl);
chatVideoView.setVideoURI(uri);

MediaController mediaController = new MediaController(getActivity());
mediaController.setAnchorView(chatVideoView);
mediaController.setMediaPlayer(chatVideoView);
chatVideoView.setMediaController(mediaController);
chatVideoView.start();

原因分析

  1. 重复绑定冲突:VideoView调用setMediaController()时会自动完成与MediaPlayer的绑定,手动调用mediaController.setMediaPlayer(chatVideoView)会导致重复绑定,引发内部引用混乱。
  2. 上下文失效:如果在Fragment中使用getActivity(),当Fragment与Activity生命周期不同步时,MediaController可能持有已失效的Activity引用,触发触摸事件时调用null对象的方法。

解决方案

方案1:移除手动绑定MediaPlayer

删除多余的setMediaPlayer调用,让VideoView自动处理绑定逻辑:

Uri uri = Uri.parse(videoUrl);
chatVideoView.setVideoURI(uri);

MediaController mediaController = new MediaController(getActivity());
mediaController.setAnchorView(chatVideoView);
// 移除该行:mediaController.setMediaPlayer(chatVideoView);
chatVideoView.setMediaController(mediaController);
chatVideoView.start();

方案2:生命周期内清理引用(Fragment场景)

在Fragment销毁视图时,主动清理VideoView的MediaController引用,避免上下文泄漏:

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (chatVideoView != null) {
        chatVideoView.setMediaController(null);
        chatVideoView.stopPlayback();
    }
}

方案3:自定义MediaController捕获异常

通过自定义MediaController捕获空指针异常,避免崩溃:

public class SafeMediaController extends MediaController {
    public SafeMediaController(Context context) {
        super(context);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        try {
            return super.dispatchTouchEvent(ev);
        } catch (NullPointerException e) {
            return false;
        }
    }
}

替换原MediaController:

MediaController mediaController = new SafeMediaController(getActivity());

验证方式

修改代码后重启应用,点击MediaController暂停按钮,确认崩溃消失且视频播放/暂停功能正常。

内容的提问来源于stack exchange,提问作者Faizan Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:54:14