Android WebView实现视频全屏播放
1.打开硬件加速
在Manifest中,对应的Activity添加
android:hardwareAccelerated = "true"
android:configChanges="keyboardHidden|orientation|screenSize"
2.创建MyWebChromeClient类
package com.studio32a.mybrowser
import android.content.Context
import android.content.pm.ActivityInfo
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.ProgressBar
import androidx.core.view.children
import androidx.core.view.get
class MyWebChromeClient(private val context: Context,
private val progressBar: ProgressBar,
private val frameFullScreen:FrameLayout) : WebChromeClient() {
//用于保存系统提供的全屏视频所在的view
//可将view添加到我们自己的视频播放锚点布局中
private var mCustomView: View? = null
private var mCustomViewCallback: CustomViewCallback? = null
private val mainActivity:MainActivity = context as MainActivity
//activity的根布局
private val linearTotal=frameFullScreen.parent as LinearLayout
//所有webView的显示区
private val frameWebviews= linearTotal[linearTotal.childCount-1] as FrameLayout
//当前所在webView进度处理
// override fun onProgressChanged(view: WebView, newProgress: Int) {
// if (progressBar.visibility == View.GONE){
// progressBar.visibility = View.VISIBLE
// }
// progressBar.progress = newProgress
// if (newProgress == 100) progressBar.visibility = View.GONE
// }
override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
super.onShowCustomView(view, callback)
//view为全屏时,系统提供的视频展示窗口
//如果view 已经存在,则隐藏
if (mCustomView != null) {
callback?.onCustomViewHidden()
return
}
mCustomView = view
mCustomView?.visibility = View.VISIBLE
mCustomViewCallback = callback
frameFullScreen.addView(mCustomView)
//隐藏主布局中所有子视图
linearTotal.children.forEach {
it.visibility=View.GONE
}
//仅显示视频锚点布局
frameFullScreen.visibility = View.VISIBLE
//frameFullScreen.bringToFront()
//设置横屏
mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
}
override fun onHideCustomView() {
super.onHideCustomView()
if (mCustomView == null) {
return
}
mCustomView?.visibility = View.GONE
frameFullScreen.removeView(mCustomView)
mCustomView = null
//还原webView的显示
//具体实现是:先隐藏根布局下所有的子视图
//只显示地址栏、工具栏及webView显示区
mainActivity.showView(frameWebviews)
try {
mCustomViewCallback!!.onCustomViewHidden()
} catch (e: Exception) {
}
//竖屏
mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
3.Activity中设置
//对currentWebView初始化时
currentWebView.webChromeClient = MyWebChromeClient(this,progressBar,frame_full_screen)
override fun onDestroy() {
super.onDestroy()
webViewList.forEach {
it.webChromeClient = null;
it.webViewClient = null;
it.settings.javaScriptEnabled = false;
it.destroy();
}
}
//在多个webview的情况下
//暂停所有非当前页的执行(包括暂停其中正在播放的视频)
private fun pauseNotCurrentWebView(){
webViewList.forEach {
it.onPause()
}
currentWebView.onResume()
}