0


kotlin 实现 webview 渲染视频 - 支持全屏播放,增加自定义返回键退出全屏

kotlin 实现 webview 渲染视频 支持全屏播放,增加自定义返回键退出全屏

  1. webview 本身不支持渲染的视频全屏播放,需要自定义实现;
  2. 重写 WebChromeClient,在onShowCustomView 中增加全屏的视图,然后隐藏webview;
  3. 取消全屏视图时,需要打开webview;
  4. 全屏时,视屏不带返回键,需要增加自定义返回键;
  5. 处理返回键时,即隐藏全屏,打开已定义的webview;

1. 初始化webview,此处用compose 实现

  1. val webView = remember {
  2. WebView(context).apply {
  3. initWebViewSettings(settings)
  4. setBackgroundColor(getColor(R.color.zen_111111))
  5. webViewClient = CustomWebViewClient()
  6. webChromeClient = CustomChromeClient()
  7. if (webUrl.isNotEmpty()) {
  8. loadUrl(webUrl)
  9. }
  10. layoutParams = ViewGroup.LayoutParams(
  11. ViewGroup.LayoutParams.MATCH_PARENT,
  12. ViewGroup.LayoutParams.MATCH_PARENT
  13. )
  14. }
  15. }

2 initWebViewSettings 函数设置

  1. fun initWebViewSettings(settings: WebSettings) {
  2. settings.javaScriptEnabled = true
  3. settings.useWideViewPort = true
  4. settings.loadWithOverviewMode = true
  5. settings.allowFileAccess = true
  6. settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
  7. settings.setSupportZoom(true)
  8. settings.javaScriptCanOpenWindowsAutomatically = true
  9. settings.pluginState = WebSettings.PluginState.ON
  10. settings.domStorageEnabled = true
  11. settings.mediaPlaybackRequiresUserGesture = false
  12. //settings.safeBrowsingEnabled = true
  13. settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
  14. }

3 重写 WebChromeClient

  1. class CustomChromeClient :WebChromeClient(){overridefunonProgressChanged(view: WebView?, newProgress: Int){
  2. progress.intValue = newProgress
  3. }overridefunonShowCustomView(view: View, callback: CustomViewCallback){if(container !=null){
  4. callback.onCustomViewHidden()return}
  5. customView = view
  6. customViewCallback = callback
  7. // 添加一个返回键val backButton =ImageButton(mContext)
  8. backButton.setBackgroundColor(Color.TRANSPARENT)// 添加返回按钮
  9. backButton.setImageResource(R.mipmap.xx)
  10. backButton.setOnClickListener{onHideCustomView()}
  11. container =FrameLayout(mContext!!)
  12. container?.addView(customView,
  13. FrameLayout.LayoutParams(
  14. FrameLayout.LayoutParams.MATCH_PARENT,
  15. FrameLayout.LayoutParams.MATCH_PARENT
  16. ))
  17. container?.addView(backButton,
  18. FrameLayout.LayoutParams(
  19. FrameLayout.LayoutParams.WRAP_CONTENT,
  20. FrameLayout.LayoutParams.WRAP_CONTENT,
  21. Gravity.START or Gravity.TOP
  22. ))(findViewById<FrameLayout>(android.R.id.content)).addView(
  23. container,
  24. FrameLayout.LayoutParams(
  25. FrameLayout.LayoutParams.MATCH_PARENT,
  26. FrameLayout.LayoutParams.MATCH_PARENT
  27. ))
  28. webActivityView?.visibility = View.GONE
  29. }overridefunonHideCustomView(){super.onHideCustomView()if(container ==null){return}(findViewById<FrameLayout>(android.R.id.content)).removeView(container)
  30. container =null
  31. webActivityView?.visibility = View.VISIBLE
  32. customViewCallback?.onCustomViewHidden()}}

4 CustomWebViewClient 重写 shouldOverrideUrlLoading

  1. inner class CustomWebViewClient : WebViewClient() {
  2. @SuppressLint("WebViewClientOnReceivedSslError")
  3. override fun onReceivedSslError(
  4. view: WebView?,
  5. handler: SslErrorHandler?,
  6. error: SslError?
  7. ) {
  8. Timber.tag(TAG).e("onReceivedSslError %s", error.toString())
  9. handler?.proceed()
  10. }
  11. override fun shouldOverrideUrlLoading(
  12. view: WebView?,
  13. request: WebResourceRequest?
  14. ): Boolean {
  15. Timber.tag(TAG).d("OverrideUrlLoading %s", request?.url.toString())
  16. val url = request?.url?.toString()
  17. if (url != null && (url.startsWith("https://") || url.startsWith("http://"))) {
  18. if (time > 0 && System.currentTimeMillis() - time < 200) {
  19. finish()
  20. } else {
  21. view?.loadUrl(url)
  22. }
  23. }
  24. return true
  25. }
  26. }
标签: android kotlin webview

本文转载自: https://blog.csdn.net/qq_27247815/article/details/140237366
版权归原作者 时空掠影 所有, 如有侵权,请联系我们删除。

“kotlin 实现 webview 渲染视频 - 支持全屏播放,增加自定义返回键退出全屏”的评论:

还没有评论