Składam razem tanią aplikację, która między innymi „oprawia” niektóre z naszych stron internetowych ... Całkiem proste dzięki WebViewClient
. dopóki nie włączę wideo.
Wideo jest zrobione jako HTML5
elementy, które działają dobrze i elegancko w Chrome, iPhone'ach, a teraz, gdy naprawiliśmy problemy z kodowaniem, działa świetnie Android
w natywnej przeglądarce.
Teraz rub: WebView
nie podoba. W ogóle. Mogę kliknąć obraz plakatu i nic się nie dzieje.
Szukając w Google, znalazłem to, które jest bliskie, ale wydaje się być oparte na „linku” (jak w href ...) zamiast na elemencie wideo. (onDownloadListener nie wydaje się być wywoływany dla elementów wideo ...)
Widzę również odniesienia do zastępowania onShowCustomView, ale wydaje się, że nie jest to wywoływane w elementach wideo ... ani nie powinnoOverrideUrlLoading ..
Wolałbym nie zajmować się „ściąganiem xml z serwera, przeformatowaniem go w aplikacji”… utrzymując układ fabuły na serwerze, mogę nieco lepiej kontrolować zawartość bez zmuszania ludzi do ciągłego aktualizowania aplikacji. Więc jeśli uda mi się przekonać WebView do obsługi tagów, takich jak natywna przeglądarka, byłoby najlepiej.
Wyraźnie brakuje mi czegoś oczywistego… ale nie mam pojęcia co.
VideoEnabledWebView
tutaj stackoverflow.com/questions/15768837/ ...Odpowiedzi:
Odpowiadam na ten temat na wypadek, gdyby ktoś to przeczytał i jest zainteresowany wynikiem. Możliwe jest obejrzenie elementu wideo (tag video html5) w ramach WebView, ale muszę powiedzieć, że musiałem sobie z tym radzić przez kilka dni. Oto kroki, które musiałem wykonać do tej pory:
- Znajdź prawidłowo zakodowany film
-Podczas inicjowania WebView, ustaw JavaScript, wtyczki WebViewClient i WebChromeClient.
-Obsługuj onShowCustomView w obiekcie WebChromeClient.
-Obsługuj zdarzenia onCompletion i onError dla wideo, aby wrócić do widoku sieci Web.
Ale teraz powinienem powiedzieć, że nadal istnieje ważna kwestia. Mogę to zagrać tylko raz. Za drugim razem, gdy klikam dyspozytor wideo (albo plakat, albo jakiś przycisk odtwarzania), nic nie robi.
Chciałbym również, aby wideo było odtwarzane w ramce WebView, zamiast otwierać okno Media Player, ale jest to dla mnie kwestia drugorzędna.
Mam nadzieję, że komuś to pomoże, a także dziękuję za wszelkie komentarze lub sugestie.
Saludos, terrícolas.
źródło
WebChromeClient
i nadpisz odpowiednie metody, których potrzebujesz. Jeśli nalegasz, mogę przesłać resztę zajęć później, gdy wrócę do domu.Po długich poszukiwaniach udało mi się to. Zobacz poniższy kod:
Test.java
HTML% VIDEO.java
custom_screen.xml
video_loading_progress.xml
colors.xml
Manifest.xml
Spodziewam się reszty rzeczy, które potrafisz zrozumieć.
źródło
Odpowiedź mdelolmo była niezwykle pomocna, ale jak powiedział, wideo jest odtwarzane tylko raz i nie można go ponownie otworzyć.
Przyjrzałem się temu trochę i oto, co znalazłem, na wypadek gdyby jacyś znużeni podróżnicy WebView, tacy jak ja, natknęli się w przyszłości na ten post.
Po pierwsze, przejrzałem dokumentację VideoView i MediaPlayera i lepiej zrozumiałem, jak one działają. Gorąco je polecam.
Następnie spojrzałem na kod źródłowy, aby zobaczyć, jak robi to przeglądarka Android . Znajdź stronę i zobacz, jak sobie radzą
onShowCustomView()
. Zachowują odniesienie doCustomViewCallback
i do widoku niestandardowego.Mając to wszystko na uwadze i mając na uwadze odpowiedź mdelolmo, kiedy skończysz z wideo, wszystko, co musisz zrobić, to dwie rzeczy. Po pierwsze, w miejscu
VideoView
, do którego zapisałeś odniesienie, wywołaniestopPlayback()
, które zwolni elementMediaPlayer
do wykorzystania później w innym miejscu. Możesz to zobaczyć w kodzie źródłowym VideoView . Po drugie,CustomViewCallback
zapisałeś odniesienie do połączeniaCustomViewCallback.onCustomViewHidden()
.Po wykonaniu tych dwóch czynności możesz kliknąć ten sam film lub inny film, a otworzy się jak poprzednio. Nie ma potrzeby ponownego uruchamiania całego WebView.
Mam nadzieję, że to pomoże.
źródło
W rzeczywistości wydaje się wystarczające, aby po prostu dołączyć zwykłego WebChromeClient do widoku klienta, ala
i musisz mieć włączone przyspieszenie sprzętowe!
Przynajmniej jeśli nie musisz odtwarzać wideo na pełnym ekranie, nie ma potrzeby wyciągania VideoView z WebView i wypychania go do widoku działania. Będzie odtwarzany w wyznaczonym prostokącie elementu wideo.
Jakieś pomysły, jak przechwycić przycisk rozwijania wideo?
źródło
Wiem, że ten wątek ma kilka miesięcy, ale znalazłem rozwiązanie do odtwarzania wideo wewnątrz WebView bez robienia tego na pełnym ekranie (ale nadal w odtwarzaczu multimedialnym ...). Jak dotąd nie znalazłem w internecie żadnej wskazówki na ten temat, więc może jest to również interesujące dla innych. Nadal zmagam się z niektórymi problemami (np. Umieszczam odtwarzacz multimedialny w odpowiedniej sekcji ekranu, nie wiem, dlaczego robię to źle, ale myślę, że jest to stosunkowo mały problem ...).
W Custom ChromeClient określ LayoutParams:
Moja metoda onShowCustomView wygląda następująco:
Mam więc nadzieję, że mógłbym pomóc ... Ja też musiałem bawić się kodowaniem wideo i widziałem różne rodzaje korzystania z WebView z wideo html5 - w końcu mój działający kod był dziką mieszanką różnych części kodu, które znalazłem w internet i kilka rzeczy, które musiałem sam wymyślić. To naprawdę było uciążliwe w a *.
źródło
To podejście działa dobrze aż do wersji 2.3. A przez dodanie hardwareaccelerated = true działa nawet od 3.0 do ICS.Jeden problem, z którym się obecnie zmagam, polega na tym, że po drugim uruchomieniu aplikacji odtwarzacza multimediów dochodzi do awarii, ponieważ nie zatrzymałem odtwarzania i wypuściłem Media Player. Ponieważ obiekt VideoSurfaceView, który otrzymujemy w funkcji onShowCustomView z systemu operacyjnego 3.0, jest specyficzny dla przeglądarki, a nie jest obiektem VideoView, jak w systemie do wersji 2.3. Jak mogę uzyskać do niego dostęp i zatrzymać odtwarzanie i zwolnić zasoby?
źródło
AM jest podobne do tego, co robi BrowerActivity . dla FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams (768, 512);
Myślę, że możemy użyć
zamiast.
Innym problemem, z którym się spotkałem, jest to, czy wideo jest odtwarzane, a użytkownik kliknie przycisk Wstecz, następnym razem przejdziesz do tej czynności (singleTop) i nie możesz odtworzyć wideo. Aby to naprawić, zadzwoniłem do
w metodzie onBackPressed działania.
źródło
Wiem, że to bardzo stare pytanie, ale czy wypróbowałeś
hardwareAccelerated="true"
flagę manifestu dla swojej aplikacji lub działania?Z tym zestawem wydaje się działać bez żadnej modyfikacji WebChromeClient (czego oczekiwałbym od elementu DOM).
źródło
hardwareAccelerated
zaczyna się od Androida 3.0Użyłem html5webview, aby rozwiązać ten problem, pobierz i umieść go w swoim projekcie, a następnie możesz kodować w ten sposób.
Aby wideo można było obracać, umieść na przykład kod android: configChanges = "orientacja" w swoim działaniu (Androidmanifest.xml)
i zastąp metodę onConfigurationChanged.
źródło
To pytanie ma już lata, ale może moja odpowiedź pomoże ludziom takim jak ja, którzy muszą obsługiwać starą wersję Androida. Wypróbowałem wiele różnych podejść, które działały na niektórych wersjach Androida, ale nie na wszystkich. Najlepszym rozwiązaniem, jakie znalazłem, jest użycie Crosswalk Webview, który jest zoptymalizowany pod kątem obsługi funkcji HTML5 i działa na Androidzie 4.1 i nowszych. Jest tak prosty w użyciu, jak domyślny Android WebView. Musisz tylko dołączyć bibliotekę. Tutaj znajdziesz prosty samouczek, jak go używać: https://diego.org/2015/01/07/embedding-crosswalk-in-android-studio/
źródło
Cóż, najwyraźniej nie jest to możliwe bez użycia JNI do zarejestrowania wtyczki w celu uzyskania zdarzenia wideo. (Osobiście unikam JNI, ponieważ naprawdę nie chcę zajmować się bałaganem, gdy w ciągu najbliższych kilku miesięcy pojawią się tablety z Androidem oparte na Atom, tracąc przenośność Javy).
Jedyną realną alternatywą wydaje się być utworzenie nowej strony internetowej tylko dla WebView i nagranie wideo w oldschoolowy sposób z linkiem A HREF, jak podano w adresie URL Codelark powyżej.
Icky.
źródło
W przypadku stosowania plastra miodu
hardwareaccelerated=true
ipluginstate.on_demand
wydaje się, że działaźródło
Miałem podobny problem. W folderze zasobów mojej aplikacji znajdowały się pliki HTML i filmy.
Dlatego filmy znajdowały się w pliku APK. Ponieważ plik APK jest w rzeczywistości plikiem ZIP, WebView nie był w stanie odczytać plików wideo.
Kopiowanie wszystkich plików HTML i wideo na kartę SD zadziałało.
źródło