Mam aplikację z wideoView, która będzie pętla tego samego wideo w kółko, aż użytkownik zrobi coś do urządzenia (ekran dotykowy, itp.) Obecnie używam OnCompletionListener(), aby ponownie uruchomić wideo gdy się skończy. Działa to poprawnie na wszystkich testowanych urządzeniach, z wyjątkiem Samsung Replenish.Wideo z zapętlaniem wideo Replenish
Oto mój kod:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
}
});
Co się dzieje na Replenish jest wideo odtwarza całą drogę raz, ale wtedy nigdy nie zostanie uruchomiony ponownie, a ekran robi się cały czarny (ale podświetlenie nadal włączony). Na każdym innym urządzeniu, które przetestowałem z tym samym kodem, próbowałem powtórzyć wideo. Czy ktoś wie o czymś konkretnym na temat uzupełnienia, które może spowodować ten błąd? Sądziłem, że może opóźnienie wywołań setVideoPath() i start() o 200-300ms może pomóc, ale to nie miało żadnego wpływu. Naprawdę jestem tu zagubiony.
widzę te wiadomości w moim dzienniku:
ERROR/QCvdec (87): OMX Flush wydane po vdec nie jest jeszcze zainicjowany.
błąd/QCvdec (87) OMXCORE-SM: Recieved polecenie wyłącza (2)
błąd/QCvdec (87) OMX Przepłukać wystawione podczas vdec nie jest zainicjowana.
ERROR/QCvdec (87): OMXCORE-SM: polecenie Recieved ENABLE (3)
Ale te dzienniki dzieją się zarówno podczas uruchamiania wideo (po raz pierwszy gra) i gdy nie daje się uruchomić jeszcze raz. więc nie jestem pewien, czy są one związane z moim problemem
Edit:
Ja tylko starałem ustawienie mVideoView null, a następnie uzyskanie nowej odniesienie do niej z findViewById() tuż przed setVideoPath(). Wiem, że to skomplikowałoby sposób konfigurowania OnCompletionListener. Ale niezależnie od tego i tak to nie zadziałało, wciąż ten sam ciemny ekran.
Edit 2:
zacząłem zauważać, że czasami wideo nawet nie uruchomić po raz pierwszy. Używam tych samych dwóch linii, aby rozpocząć go po raz pierwszy:
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
Wydaje się, aby rozpocząć bardziej konsekwentnie, ale nie całkiem 100%, gdy jego pierwszy raz, to jest odtwarzana.
Edytuj 3: Oto, jak to mam teraz skonfigurować. Ręczne ustawienie OnPreparedListener, aby uruchomić wideo dla mnie. Więc dodałem to do mojego onCreate()
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
Wtedy gdy jestem gotowy, aby ponownie uruchomić film po prostu dzwonić tylko metodę setVideoPath() w następujący sposób:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
}
});
Wydaje się to robić sztuczka. Pozwalam jej jednak biegać przez jakiś czas, aby się upewnić.
Edycja 4:
@MByD W kodzie VideoView setVideoPath() jest opakowaniem do setVideoUri(). setVideoURI() ustawia mStartWhenPrepared = false;
Domyślnie OnPreparedListener sprawdza ten przełącznik, aby zdecydować, czy rozpocząć odtwarzanie, czy nie. Dlatego nie zaczyna się od domyślnego detektora. Nie zajmowałem się tym więcej, ale może istnieć metoda ustawiająca, która pozwala mi zmienić wartość mStartWhenPrepared na true, co spowodowałoby uruchomienie wideo z domyślnego detektora.
Interesujące pytanie. – PedroAGSantos