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

Progress Dialog消失后VideoView无法自动播放的问题排查建议

解决VideoView在对话框消失后无法自动播放的问题

看起来你的核心需求是让视频准备完成后,等进度对话框延迟关闭,再自动播放视频。但当前代码的逻辑顺序有问题,导致播放逻辑根本没机会执行,我来帮你梳理下问题并给出修改方案:

问题根源分析

你在onPrepared方法里的执行顺序是:

  1. 先安排3秒后关闭对话框
  2. 立刻检查对话框是否显示(这时候对话框还在显示),所以跳过了播放代码块
  3. 3秒后对话框关闭,但这时候播放逻辑已经执行过一轮,不会再触发

两种可行的修改方案

方案一:把播放逻辑移到对话框关闭的Runnable中

直接在延迟关闭对话框的任务里执行播放操作,确保对话框消失后才启动视频:

final ProgressDialog progressDialog = new ProgressDialog(PlayVideo.this);
progressDialog.setTitle("Please set the pyramid");
progressDialog.setMessage("Loading...");
progressDialog.show();

myVideoView = (VideoView) findViewById(R.id.video_view);
Uri uri = getIntent().getParcelableExtra("uri");
try {
    myVideoView.setMediaController(mediaControls);
    myVideoView.setVideoURI(uri);
} catch (Exception e) {
    Log.e("Error", e.getMessage());
    e.printStackTrace();
}
myVideoView.requestFocus();
myVideoView.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        if(progressDialog.isShowing()) {
            Runnable progressRunnable = new Runnable() {
                @Override
                public void run() {
                    progressDialog.cancel();
                    // 对话框关闭后再处理播放逻辑
                    myVideoView.seekTo(position);
                    if (position == 0) {
                        myVideoView.start();
                    } else {
                        myVideoView.pause();
                    }
                }
            };
            Handler pdCanceller = new Handler();
            pdCanceller.postDelayed(progressRunnable, 3000);
        }
    }
});

方案二:监听对话框的关闭事件

如果需要更灵活的控制,可以给ProgressDialog添加关闭监听,在对话框真正消失时触发播放:

final ProgressDialog progressDialog = new ProgressDialog(PlayVideo.this);
progressDialog.setTitle("Please set the pyramid");
progressDialog.setMessage("Loading...");
// 设置对话框关闭回调
progressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        // 对话框关闭后执行播放逻辑
        myVideoView.seekTo(position);
        if (position == 0) {
            myVideoView.start();
        } else {
            myVideoView.pause();
        }
    }
});
progressDialog.show();

myVideoView = (VideoView) findViewById(R.id.video_view);
Uri uri = getIntent().getParcelableExtra("uri");
try {
    myVideoView.setMediaController(mediaControls);
    myVideoView.setVideoURI(uri);
} catch (Exception e) {
    Log.e("Error", e.getMessage());
    e.printStackTrace();
}
myVideoView.requestFocus();
myVideoView.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        if(progressDialog.isShowing()) {
            Handler pdCanceller = new Handler();
            pdCanceller.postDelayed(() -> progressDialog.cancel(), 3000);
        }
    }
});

额外注意点

  • 确保position变量已经正确初始化,避免出现未赋值的异常
  • 如果视频是本地文件,Android 6.0及以上版本要提前获取存储读写权限
  • 可以在start()前调用myVideoView.resume(),确保视频处于可播放状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:45