2013-09-01 80 views
5

我正在使用VideoView显示视频流。因为我需要将MediaController附加到视图本身,并且我想防止由videoview引起的黑屏闪烁。我在我的Nexus 7上测试了下面的代码,像魅力一样工作。但是现在我在我的SGS2上测试了它,由于某种原因,OnVideoSizeChanged从未被调用过。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"); 
     } 
    }); 
} 

视频播放像它应该,我通过移除OnVideoSizeChangedListener,只是将代码中的onPrepared方法测试这一点,但是这是带回屏幕闪烁的问题,离开的MediaController独立的。 LogCat中的日志信息也会显示此行为,ONPREP标记显示但不会显示ONSIZECHANGE。在我的N7上都显示,显然导致背景颜色改变。

这是设置并启动视频代码:

videoview.setOnPreparedListener(MainActivity.this); 
      mc = new MediaController(MainActivity.this); 
      mc.setMediaPlayer(videoview); 
      videoview.setVideoURI(videourI); 
      videoview.start(); 

那么,为什么要叫一个设备上,而不是其他?

编辑: 测试了我的注意事项2,同样的问题在SGS2。

回答

1

onVideoSizeChanged是从低级别的球员实现,它可以在不同的平台不同的事件触发。玩家在onPrepared之前致电onVideoSizeChanged是完全合法的。

其实VideoView正在建立自己的OnVideoSizeChangedListener回调管理面的大小,所以你可能不应该使用它。从你的例子是为什么你正在使用它是我也不清楚,setMediaControlleronPrepared被调用,而不是onVideoSizeChanged(可多次调用)。

+0

不会只用OnPreparedListener工作的东西是setAnchorView方法。它不附加到视频视图本身。当OnVideoSizeChanged被调用时,它可以被附加。 –

1

这似乎是与三星设备的缺陷。 我注意到在我的应用程序中,如果videoview的大小是0x0(可能也是如果它是不可见/消失)onVideoSizeChange不会被调用。一旦我将videoview大小设置为非0x0值,onVideoSizeChange被正确调用。