Android 中的 VideoView 无法正确播放视频
VideoView in Android is not playing video correctly
我在播放 VideoView 时遇到一个奇怪的问题。我已尽最大努力尽可能地简化代码。下面是 4 类:A、MirrorActivity、Replay 和 MyTask。假设以下顺序发生:
- A 已创建。
- MirrorActivity() 已创建。
- 在 MirrorActivity() 的 onCreate() 中,该实例调用 A 的 setMirrorActivity() 允许 A 引用它。
- A的doThis()方法被调用,执行mirrorActivity.playVideo ().
- playVideo() 被执行。
- Replay 的 executeVideo() 被调用。
- 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() 就可以播放视频了。
我修改了 MirrorActivity 的 playVideo() 函数以使用以下内容:
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);
}
我在播放 VideoView 时遇到一个奇怪的问题。我已尽最大努力尽可能地简化代码。下面是 4 类:A、MirrorActivity、Replay 和 MyTask。假设以下顺序发生:
- A 已创建。
- MirrorActivity() 已创建。
- 在 MirrorActivity() 的 onCreate() 中,该实例调用 A 的 setMirrorActivity() 允许 A 引用它。
- A的doThis()方法被调用,执行mirrorActivity.playVideo ().
- playVideo() 被执行。
- Replay 的 executeVideo() 被调用。
- 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() 就可以播放视频了。
我修改了 MirrorActivity 的 playVideo() 函数以使用以下内容:
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);
}