如何在 WebView 中停止视频播放

Posted

技术标签:

【中文标题】如何在 WebView 中停止视频播放【英文标题】:How to stop video playing in WebView 【发布时间】:2019-06-02 05:28:33 【问题描述】:

我在 Xamarin.Forms 应用程序 (UWP!) 上工作。它具有主从架构。 Master 页面有一个 ListView,其中的每个项目都会打开一个相应的 Detail 页面。第一个详细信息页面只有一个 WebView,它在加载时播放 YouTube 视频。第二个细节视图现在只有一个占位符标签。

当我从第一个详细信息页面切换到第二个详细信息页面时,仍然可以听到第一个详细信息页面的视频声音。当我切换回第一个详细信息页面时,视频再次加载,现在我听到两个声音。如何在切换到第二个详细信息页面时停止视频并在返回时恢复?如果这是不可能的,我该如何在离开其详细信息页面时停止视频?

我想我可以在详细信息页面的重写 OnDisappearing() 方法中做一些事情:

    protected override void OnDisappearing()
    
        MyWebView.NavigateToString(""); // This does not work, as NavigateToString() is not part of WebView. 
        base.OnDisappearing();
    

我可以用什么来停止在 WebView 中播放视频?

【问题讨论】:

【参考方案1】:

您能否告诉我可以使用什么来停止在 WebView 中播放视频?

根据您的要求,您可以注入Eval java 脚本。

private  void Button_Clicked(object sender, EventArgs e)

    string pausefunctionString = @"
    var videos = document.querySelectorAll('video');  
    [].forEach.call(videos, function(video)  video.pause(); );
    "; 
    MyWebView.Eval(pausefunctionString);

更新

我已经重新检查了您的问题,当您导航到另一个页面时,WebView 没有正确释放。如果您想停止WebView 视频播放,可以通过自定义WebViewRenderer 使其导航到空白页面。

[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRender))]

namespace App4.UWP

    class CustomWebViewRender : WebViewRenderer
    
        private Windows.UI.Xaml.Controls.WebView _WebView;
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        
            base.OnElementChanged(e);
            if (Control != null)
            
                var source = Element.Source as UrlWebViewSource;
                _WebView = new Windows.UI.Xaml.Controls.WebView();
                SetNativeControl(_WebView);
            
        
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == WebView.SourceProperty.PropertyName)
            
                var source = Element.Source as UrlWebViewSource;
                if (source.Url == string.Empty)
                
                    _WebView.NavigateToString(string.Empty);
                
            
        
    

用法

protected override void OnAppearing()

    base.OnAppearing();
    MyWebView.Source = "https://www.youtube.com";

protected override void OnDisappearing()

    MyWebView.Source = string.Empty;
    base.OnDisappearing();

Xaml

<WebView HeightRequest="500" WidthRequest="500"  x:Name="MyWebView"/>

【讨论】:

感谢您的回答。请问,document.querySelectorAll('video') 中的'video' 是什么?因为当我尝试按原样使用代码时,它给了我空引用异常。 htmlvideo标签。 我不确定我是否理解。我在 xaml 中没有任何视频标签。 嗨@DavidShochet,我已经检查了您的问题并回复了答案。 我试过了,但是Eval函数在OnDisappearing方法中不起作用。

以上是关于如何在 WebView 中停止视频播放的主要内容,如果未能解决你的问题,请参考以下文章

YouTube 视频未在 WebView 中播放 - Android

在 mediaplayer 中播放的 Android webview 视频

WebView - Youtube 视频在后台播放并最小化

为啥 HTML5 视频不能在 IOS 8 WebApp(webview) 中播放?

如何在没有 UIWebView 的情况下播放 youtube 视频或在 youtube 视频开始使用 webview 播放时检测视频播放器?

如何在android webview中播放视频URL