通常,Android VideoView不显示视频,音频正在播放。如何让视频100%显示

时间:2012-08-04 01:29:55

标签: android video touch android-videoview

我正在使用Mono for Android。

我已经完成了有关使用VideoView的所有帖子,但无法找到答案。我已经转而使用带有MediaPlayer的SurfaceView,但又没有运气了。

我想在用户没有触摸屏幕一段时间后开始播放视频,所以我有一个FrameLayout来保存VideoView,当我想要显示视频时,我可以看到它。

当我启动视频时,它通常不显示(大约80%的时间),但音频开始播放。如果您触摸屏幕,则会显示视频。我尝试过不同的视频(.mp4和.3gp),但由于视频在您触摸屏幕后实际显示,我怀疑它是其他内容。

我在几台具有相同结果的设备上试过这个,虽然它们来自同一个制造商。它们都是Coby设备(一个7“和另一个9.7”)并且运行Android 4.0。我的目标是Android 2.3 API。

这是我的xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

    ... A bunch of controls ...

<FrameLayout
        android:id="@+id/videoViewBack"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#FF000000"
        android:visibility="gone">
    <VideoView android:id="@+id/videoView"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_gravity="center"
              android:visibility="visible"/>
</FrameLayout>
</LinearLayout>

我启动视频的功能如下:

        private void StartVideo()
    {

        RequestedOrientation = ScreenOrientation.SensorLandscape; // Force into landscape so the video looks good

        FrameLayout vidBack = FindViewById<FrameLayout>(Resource.Id.videoViewBack);
        vidBack.Visibility = ViewStates.Visible;

        VideoView vid = FindViewById<VideoView>(Resource.Id.videoView);
        vid.SetOnTouchListener(this);
        vid.SetOnCompletionListener(this);
        vid.SetVideoPath(_attractFile);
        vid.SetMediaController(new MediaController(this));
        vid.RequestFocus();
        vid.Start();
    }

我还尝试将Start()调用放在OnPreparedListener中,但这没有帮助。

我拔出我的头发,希望有人知道我忘了做什么蠢事。

修改

关于问题与布局传递中视频大小不正确的理论,我做了以下似乎已经纠正了问题。但我不是100%肯定为什么,或者它只是戳戳jello

在OnPrepared处理程序中,我添加了:

View mainScreen = FindViewById<View>(Resource.Id.MainScreen);
mainScreen.requestLayout();
mainScreen.postInvalidateDelayed(1000);
mainScreen.postInvalidate();

其中mainScreen是我的xml中的主要FrameLayout。在PostInvalidate中大部分时间都修复它,添加PostInvalidateDelayed会在100%的时间内修复它(我认为:))。

关于为什么会这样做的想法?

2 个答案:

答案 0 :(得分:0)

    @Override
public void surfaceCreated(final SurfaceHolder holder) {
    mPlayer.setDisplay(holder); // 指定SurfaceHolder

    gameActivity.handler.post(new Runnable() {
        @Override
        public void run() {
            try {
                mPlayer.prepare();
            } catch (IllegalStateException e1) {
            } catch (IOException e1) {
            }
        }
    });
}

答案 1 :(得分:0)

试试这个:

videoView.setZOrderOnTop(true);