繁体   English   中英

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

[英]VideoView in Android is not playing video correctly

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

  1. 创建一个
  2. MirrorActivity ()已创建。
  3. MirrorActivity ()的onCreate()内部,该实例调用AsetMirrorActivity ()以允许A对其进行引用。
  4. 调用一个 doThis ()方法,该方法执行mirrorActivity。 playVideo ()。
  5. playVideo()被执行。
  6. 重播的 executeVideo()被调用。
  7. MyTask已执行。

由于某些奇怪的原因,执行上述操作时,视频无法播放。 但是,在MirrorActivity内部按下myButton ImageButton时,它将按命令播放视频。 通过调用MirrorActivity的 playVideo (),两者似乎都在做相同的事情。 您知道为什么以上命令不执行吗?

一种

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

}

MyTask

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中访问。 并且在每个声明之后也要start()。

也尝试这种方法。

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

暂无
暂无

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

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