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


创建一个。
MirrorActivity()已创建。
在MirrorActivity()的onCreate()内部,该实例调用A的setMirrorActivity()以允许A对其进行引用。
调用一个doThis()方法,该方法执行mirrorActivity.playVideo()。
playVideo()被执行。
重播的executeVideo()被调用。
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();
}


}

我的任务

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

09-30 17:04