Android 中的 VideoView 无法正确播放视频

VideoView in Android is not playing video correctly

我在播放 VideoView 时遇到一个奇怪的问题。我已尽最大努力尽可能地简化代码。下面是 4 类:A、MirrorActivity、Replay 和 MyTask。假设以下顺序发生:

  1. A 已创建。
  2. MirrorActivity() 已创建。
  3. MirrorActivity() 的 onCreate() 中,该实例调用 AsetMirrorActivity() 允许 A 引用它。
  4. AdoThis()方法被调用,执行mirrorActivity.playVideo ().
  5. playVideo() 被执行。
  6. Replay 的 executeVideo() 被调用。
  7. MyTask 已执行。

由于某些奇怪的原因,执行上述操作时,视频没有播放。但是,当在 MirrorActivity 中按下 myButton ImageButton 时,它会根据命令播放视频。这两个似乎都通过调用 MirrorActivity's playVideo() 来做同样的事情。知道上面为什么不执行吗?

A

public class A{
private static final A instance = new A();
private MirrorActivity mirrorActivity;

public static A getInstance()   {
    return instance;
}

public void setMirrorActivity(MirrorActivity mirrorActivity) {
    this.mirrorActivity = mirrorActivity;
}

public void doThis(String url){
    mirrorActivity.playVideo(String url);
}

}

MirrorActivity

public class MirrorActivity extends Activity {
public static String VIDEO_URL = "example.mp4";
public VideoView mVideoView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_overlay_gradient);

    // Set Mirror Activity
    A.getInstance().setMirrorActivity(this);

    mVideoView = (VideoView) findViewById(R.id.mirrorVideoView);
    MyTask vTask = new MyTask(mVideoView);

    ImageButton myButton = (ImageButton) findViewById(R.id.myButton);
    myButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) 
        {
            MirrorActivity.this.playVideo(MirrorActivity.VIDEO_URL);
        }
    });
}

public void playVideo(String videoURL)
{
    MyTask mt = new MyTask(mVideoView);
    Replay.executeVideo(MirrorActivity.VIDEO_URL, 
              this, 
              mVideoView, 
              mt);
}

}

重播

public class Replay{
public static void executeVideo(String uri, Activity activity, VideoView vid, MyTask mt) 
{
    vid.setMediaController(new MediaController(activity););
    vid.setVideoURI(Uri.parse(uri));
    mt.execute();
}

}

我的任务

public class MyTask extends AsyncTask<Void, Integer, Void> {
    private VideoView video;
    private int duration = 0;           // in milliseconds

    public MyTask(VideoView vid)    {
        video = vid;
    }

    @Override
    protected Void doInBackground(Void... params)   {
        video.start();
        video.requestFocus();

        video.setOnPreparedListener(new OnPreparedListener(){
            @Override
            public void onPrepared(MediaPlayer mp) {
                duration = video.getDuration();
            }
        });

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values)  {
        super.onProgressUpdate(values);
    }
}

我认为 UI 元素无法在 doInBackground 中访问。并在每次声明后开始()。

也试试这个方法。

private MediaController ctlr;

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_overlay_gradient);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
// Set Mirror Activity
   A.getInstance().setMirrorActivity(this);

   mVideoView = (VideoView) findViewById(R.id.mirrorVideoView);

       Uri uri=Uri.parse(videourl or video path);
        mVideoView .setVideoURI(uri);
        mVideoView .setVideoPath(videourl);

        ctlr=new MediaController(this);
        ctlr.setAnchorView(video);
        ctlr.setMediaPlayer(video);
        mVideoView .setMediaController(ctlr);
        mVideoView .requestFocus();
        mVideoView .start();
}

我的天啊。我相信我找到了解决方案。对于那些正在调查的人,我很抱歉,但这是我为使其双向工作所做的工作。现在按下 imageButton 并调用 A.doThis() 就可以播放视频了。

我修改了 MirrorActivityplayVideo() 函数以使用以下内容:

public void playVideo(final String videoURL)
{
    Runnable runnable = new Runnable(){

        @Override
        public void run()
        {
             MyTask mt = new MyTask(mVideoView);
             Replay.executeVideo(videoURL, 
                  MirrorActivity.this, 
                  mVideoView, 
                  mt);
        }
    });

    Handler mainHandler = new Handler(Looper.getMainLooper());
    mainHandler.post(runnable);
}