Android WebView实现视频全屏播放

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()
}

 

 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值