OnVideoSizeChanged从未调用过

Ray*_*d P 5 android

我正在使用VideoView来显示视频流.因为我需要将MediaController附加到视图本身,我想防止视频视图导致的黑屏闪烁.我在Nexus 7上测试了下面的代码,就像一个魅力.但是现在我在我的SGS2上测试了它,并且由于某种原因从未调用过OnVideoSizeChanged.

@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    Log.i("ONPREP", "called");
    mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

            videoview.setMediaController(mc);
            mc.setAnchorView(videoview);
            videoview.setBackgroundColor(Color.TRANSPARENT);

            Log.i("ONSIZECHANGE", "called");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

视频播放应该是这样,我通过删除OnVideoSizeChangedListener并将代码放在onPrepared方法中进行测试,但这会带回屏幕闪烁问题并使mediacontroller无法连接.此行为也由LogCat中的日志信息显示,ONPREP标记显示但从不显示ONSIZECHANGE.在我的N7上都显示,显然会导致背景颜色发生变化.

这是设置和启动视频的代码:

videoview.setOnPreparedListener(MainActivity.this);
            mc = new MediaController(MainActivity.this);
            mc.setMediaPlayer(videoview);
            videoview.setVideoURI(videourI);
            videoview.start();
Run Code Online (Sandbox Code Playgroud)

那么为什么要在一台设备上调用而不在另一台设备上呢?

编辑:在我的Note 2上测试它,与SGS2上的问题相同.

msh*_*msh 2

onVideoSizeChanged由低级播放器实现中的事件触发,该事件在不同平台上可能有所不同。onVideoSizeChanged玩家之前跟注是完全合法的onPrepared

实际上 VideoView 正在设置自己的OnVideoSizeChangedListener回调来管理表面大小,因此您可能根本不应该使用它。从您的示例中,我不清楚您为什么使用它,setMediaController应该在 中调用onPrepared,而不是onVideoSizeChanged(可以多次调用)。