2013-09-01 108 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被正確調用。