2013-09-01 9 views
5

Я работаю с VideoView для показа видеопотока. Потому что мне нужно, чтобы MediaController был привязан к самому представлению, и я хочу предотвратить появление мерцания на черном экране, вызванное видеоизображением. Я тестировал приведенный ниже код на своем 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 инициируется событием от реализации игрока низкого уровня, которое может быть различным на разных платформах. Это совершенно законно для игрока, чтобы позвонить onVideoSizeChanged до onPrepared.

На самом деле VideoView устанавливает свой собственный обратный вызов OnVideoSizeChangedListener для управления размером поверхности, поэтому вы, вероятно, не должны использовать его вообще. Из вашего примера мне непонятно, почему вы его используете, setMediaController следует вызывать в onPrepared, а не onVideoSizeChanged (что можно назвать несколько раз).

+0

То, что не работает с помощью OnPreparedListener, является метод setAnchorView. Он не привязан к самому видеовизу. Когда вызывается OnVideoSizeChanged, он может быть присоединен. –

1

Это похоже на ошибку с устройствами samsung. Я заметил в своем приложении, что если размер видеоизображения равен 0x0 (возможно, также, если он невидим/ушел), onVideoSizeChange не вызывается. После того как я установил размер видеоизображения в значение не 0x0, onVideoSizeChange вызывается правильно.

Смежные вопросы