2013-09-01 16 views
5

Pracuję z VideoView, aby wyświetlić strumień wideo. Ponieważ potrzebuję MediaController do dołączenia do samego widoku i chcę zapobiec migotaniu czarnego ekranu spowodowanemu przez podgląd wideo. Przetestowałem poniższy kod na moim Nexusie 7, zadziałało jak czar. Ale teraz testowałem go na SGS2 iz jakiegoś powodu OnVideoSizeChanged nigdy nie jest wywoływany.Funkcja OnVideoSizeChanged nigdy nie była wywoływana

@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"); 
     } 
    }); 
} 

odtwarzania wideo tak jak powinien, ja testowałem to przez usunięcie OnVideoSizeChangedListener i tylko wprowadzenie kodu w metodzie onPrepared, ale to jest przywrócenie problem migotania ekranu i pozostawia mediacontroller przyłączone. To zachowanie jest również pokazywane przez informacje Log w LogCat, tag ONPREP pokazuje, ale nigdy ONSIZECHANGE. Na moim N7 oba pokazują, oczywiście powodują zmianę koloru tła.

Jest to kod, który ustawia i zaczyna się film:

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

Więc dlaczego to się nazywa na jednym urządzeniu, a nie inny?

Edytuj: Testowałem to w mojej notatce 2, w tym samym numerze co na SGS2.

Odpowiedz

1

onVideoSizeChanged jest wyzwalane przez zdarzenie z implementacji odtwarzacza niskiego poziomu, które może być różne na różnych platformach. Gracz jest całkowicie legalny pod numerem onVideoSizeChanged przed onPrepared.

Właściwie VideoView ustawia własne wywołanie zwrotne OnVideoSizeChangedListener w celu zarządzania rozmiarem powierzchni, więc prawdopodobnie nie powinno się go używać w ogóle. Z twojego przykładu nie jest dla mnie jasne, dlaczego go używasz, setMediaController powinno być wywoływane w onPrepared, a nie onVideoSizeChanged (które można nazwać wiele razy).

+0

Rzeczą, która nie działa tylko przy użyciu OnPreparedListener jest metoda setAnchorView. Nie jest dołączony do samego obrazu wideo. Po wywołaniu OnVideoSizeChanged można go dołączyć. –

1

Wygląda na to, że jest to błąd w urządzeniach Samsung. Zauważyłem w mojej aplikacji, że jeśli rozmiar wideo wynosi 0x0 (prawdopodobnie również, jeśli jest niewidoczny/nie ma), onVideoSizeChange nie jest wywoływany. Po ustawieniu rozmiaru wideoview na wartość inną niż 0x0, właściwość onVideoSizeChange jest wywoływana poprawnie.

Powiązane problemy