Nah, saya sudah mencari beberapa hari, bagaimana menampilkan video HTML5 dalam mode layar penuh di WebView android.
Saya berhasil memutar video HTML5 di tampilan web saya. Masalah muncul saat menampilkan video dalam mode layar penuh.
Seperti yang saya ketahui, android memiliki dua cara menangani tag <video>:
Pada versi android <= 2.3.3 , metode onShowCustomView diaktifkan, dan saya bisa memiliki instance VideoView, dan menyetel listener saat video selesai, menyetel pengontrol, dll. Sejauh ini bagus.
Di ICS (dan mungkin 3.0 ke atas) , tampaknya <video> ditangani dengan cara yang berbeda. Saat video HTML5 diputar, onShowCustomView tidak dipanggil dalam mode normal - sepertinya ada bisnis internal di dalam WebView yang memutar video, dan semua kontrol yang ditentukan dalam tag <video> ditampilkan - I tidak dapat mengaksesnya dengan cara apa pun. Sebenarnya, jika video diputar dalam mode normal ini tidak masalah karena kontrolnya ada dan berfungsi.
Hal itu membawa saya ke masalah besar: saat menampilkan video dalam mode layar penuh, onShowCustomView dipanggil - tetapi di ICS, parameter "view" bukan merupakan instance dari VideoView.
Saya berhasil menemukan bahwa instance tersebut adalah VideoSurfaceView, kelas dalam pribadi dari kelas HTML5VideoFullScreen. Satu-satunya cara kita dapat mengakses kelas dalam ini adalah melalui refleksi.
Setelah melihat GrepCode untuk kelas ini, saya mengetahui bahwa tidak seperti VideoView, HTML5VideoFullScreen $ VideoSurfaceView tidak menyimpan instance MediaPlayer sehingga saya dapat mendengarkan kejadiannya atau mengakses kontrolnya. Satu-satunya hal yang dapat saya lakukan adalah mengambil VideoSurfaceView ini apa adanya dan meletakkannya di dalam tata letak layar penuh tanpa mengontrolnya.
Intinya - Saat menampilkan video dalam layar penuh, saya tidak tahu kapan video berakhir, kontrolnya tidak ditampilkan - ini sangat menyedihkan. Saya tidak bisa mendapatkan pemicu untuk menutup layar penuh.
Saya mencoba beberapa solusi yang tidak berhasil:
Refleksi: Saya mencoba menjangkau instance HTML5VideoFullScreen, yang menampung anggota MediaPlayer, dari VideoSurfaceView kelas dalam. Saya tidak berhasil mendapatkannya, saya tidak yakin ini mungkin (ViewSurfaceView tidak menyimpan instance pemiliknya).
Mendaftar untuk acara video melalui Javascript (onended, misalnya), dan menangani apa yang saya butuhkan kembali di JAVA melalui Javascript Antarmuka: Saya menemukan solusi ini tidak dapat diandalkan karena saat melakukan ini saya mengalami masalah lain: tag <video> dapat bersarang di sebuah. Sumber iframe bukan milik saya dan saya tidak bisa mendapatkan kontennya (getElementById atau getElementsByTagName [i] adalah nulls) - yang berarti, saya tidak dapat menjangkau elemen <video> di dalam iframe.
Saya masih mencari solusi, sangat sedikit yang ditulis tentang masalah ini. Apakah ada yang berhasil menyelesaikannya? Bantuan akan sangat dihargai!
Kelas VideoView : Di sini (memiliki MediaPlayer)
HTML5VideoFullScreen $ VideoSurfaceView class: Di sini (tidak memiliki MediaPlayer)
Jawaban:
Sunting 2014/10: dengan permintaan populer Saya mempertahankan dan memindahkan ini ke GitHub. Silakan periksa cprcrack / VideoEnabledWebView untuk versi terakhir. Akan menyimpan jawaban ini hanya untuk referensi.
Edit 2014/01: peningkatan penggunaan contoh untuk menyertakan tampilan nonVideoLayout, videoLayout, dan videoLoading, bagi pengguna yang meminta lebih banyak kode contoh untuk pemahaman yang lebih baik.
Sunting 2013/12: beberapa perbaikan bug yang terkait dengan kompatibilitas perangkat Sony Xperia, tetapi pada kenyataannya memengaruhi semua perangkat.
Sunting 2013/11: setelah rilis Android 4.4 KitKat (API level 19) dengan tampilan web Chromium barunya, saya harus bekerja keras lagi. Beberapa perbaikan dilakukan. Anda harus memperbarui ke versi baru ini. Saya merilis sumber ini di bawah WTFPL .
Sunting 2013/04: setelah 1 minggu kerja keras, saya akhirnya mencapai semua yang saya butuhkan. Saya pikir dua kelas generik yang saya buat ini dapat menyelesaikan semua masalah Anda.
VideoEnabledWebChromeClient
dapat digunakan sendiri jika Anda tidak memerlukan fungsionalitas yangVideoEnabledWebView
menambahkan. NamunVideoEnabledWebView
harus selalu mengandalkan aVideoEnabledWebChromeClient
. Harap baca semua komentar dari kedua kelas dengan seksama.VideoEnabledWebChromeClient
VideoEnabledWebView
Contoh penggunaan:
Tata letak utama activity_main.xml tempat kita meletakkan VideoEnabledWebView dan tampilan lain yang digunakan:
Aktivitas onCreate () , di mana kita menginisialisasinya:
Dan jangan lupa untuk memanggil onBackPressed () :
sumber
Diuji pada versi Android 9.0
Tidak ada jawaban yang berhasil untuk saya. Ini adalah hal terakhir yang berhasil
Di AndroidManifest.xml
Sumber Monster Techno
sumber
Sunting: silakan lihat jawaban saya yang lain , karena Anda mungkin tidak membutuhkan ini sekarang.
Seperti yang Anda katakan, di API level 11+, HTML5VideoFullScreen $ VideoSurfaceView diteruskan. Tapi menurut saya Anda tidak benar ketika Anda mengatakan bahwa "itu tidak memiliki MediaPlayer".
Ini adalah cara untuk menjangkau instance MediaPlayer dari instance HTML5VideoFullScreen $ VideoSurfaceView menggunakan refleksi :
Jadi, sekarang Anda dapat menyetel listener onCompletion dari instance MediaPlayer seperti ini:
Kode tidak gagal tetapi saya tidak sepenuhnya yakin apakah listener onCompletion itu benar-benar akan dipanggil atau dapat berguna untuk situasi Anda. Tapi kalau-kalau ada yang mau mencobanya.
sumber
Terima kasih banyak untuk kelas itu, Cristian.
Saya membuat sedikit perubahan sehingga tampilan pemuatan kustom bersifat opsional, seperti:
Saya juga menambahkan konstruktor baru yang hanya membutuhkan dua parameter. Bagaimanapun, hanya penyederhanaan kecil jika Anda tidak memerlukan tampilan pemuatan. Sekali lagi terima kasih telah memberikan ini.
sumber
Setel saja
mWebView.setWebChromeClient(new WebChromeClient());
dan pemutaran video seperti biasa tidak memerlukan tampilan khusus.
sumber
Ini bagus. Tetapi jika Anda ingin tautan situs web Anda terbuka di aplikasi itu sendiri, tambahkan kode ini di ExampleActivity.java Anda:
sumber
Jawaban Cprcrack bekerja dengan sangat baik untuk API level 19 ke bawah. Hanya sedikit tambahan untuk cprcrack
onShowCustomView
akan membuatnya berfungsi pada API level 21+Anda juga perlu mencerminkan perubahan dalam
onHideCustomView
sumber
Tampaknya di lollipop dan yang lebih baru (atau mungkin hanya Versi WebView yang berbeda)
cprcrack's
onHideCustomView()
metode pemanggilan tidak berfungsi. Ini berfungsi jika dipanggil dari tombol keluar layar penuh tetapi ketika Anda secara khusus memanggil metode itu hanya akan keluar dari layar penuh tetapiwebView
tetap kosong. Cara mengatasinya adalah dengan menambahkan baris kode ini keonHideCustomView()
:Ini akan memberi tahu webView bahwa layar penuh telah keluar.
sumber