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

Posted

技术标签:

【中文标题】WebView - Youtube 视频在后台播放并最小化【英文标题】:WebView - Youtube videos playing in background on rotation and minimise 【发布时间】:2015-10-25 15:30:23 【问题描述】:

我对 WebView 有疑问,基本上我正在加载一个在某些地方嵌入视频的论坛,如果您播放视频,然后旋转设备,视频会在后台继续播放,您可以使用它来停止它。当您最小化应用程序时也会发生这种情况。有没有办法阻止这种情况?

这是我正在使用的 WebView 代码。

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        this.view = (WebView) findViewById(R.id.webView);

        view.setWebViewClient(new WebViewClient() 
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                if (url != null && url.contains("grcade")) 
                    view.loadUrl(url);
                    view.getSettings().setjavascriptEnabled(true);
                    return true;
                 else 
                    view.getContext().startActivity(
                            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                    return true;
                
            
        );

        view.setDownloadListener(new DownloadListener() 
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimetype,
                                        long contentLength) 
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);
            


        );

        if(savedInstanceState == null)

            String url = "http://grcade.co.uk";
            view.getSettings().setJavaScriptEnabled(true);
            view.loadUrl(url);
            view.getSettings().setSupportZoom(true);
            view.getSettings().setBuiltInZoomControls(true);
            view.getSettings().setDisplayZoomControls(false);
            view.getSettings().setLoadWithOverviewMode(true);

            view.setBackgroundColor(Color.WHITE);

        

        final SwipeRefreshLayout pulltoRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);

        pulltoRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() 
            @Override
            public void onRefresh() 
                view.reload();
                pulltoRefresh.setRefreshing(false);

            
        );
    

    @Override
    public void onSaveInstanceState (Bundle outState)
    
        super.onSaveInstanceState(outState);
        view.saveState(outState);
    

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState)
    
        super.onRestoreInstanceState(savedInstanceState);
        view.restoreState(savedInstanceState);
        view.getSettings().setJavaScriptEnabled(true);
    

    //Main WebView Panel End

任何帮助都将不胜感激,因为我很困惑,我停止了它的发生并返回,但同样的方法不会起作用,因为添加它会导致应用程序恢复到默认的 webview URL,而不是重新加载用户所在的页面.

谢谢。

【问题讨论】:

【参考方案1】:

暂停/恢复视频

执行此操作的简单方法是在您希望视频停止播放时(即应用程序进入后台时)暂停 WebView。只需以下代码即可完成:

WebView view = (WebView) findViewById(R.id.webView);
view.onPause();    // This will pause videos and needs to be called for EVERY WebView you create
view.pauseTimers(); // This will pause JavaScript and layout for ALL WebViews and only needs to be called once to affect all WebViews

处理此逻辑的最佳位置是将暂停代码放在 Activity 的 onPause() 方法中,并在 onResume 中的用户视图中当 Activity 返回时恢复 WebView:

WebView mWebView; // Initialize this somewhere

@Override
protected void onPause()
    super.onPause();
    if(mWebView != null)
        mWebView.onPause();
        mWebView.pauseTimers();
    


@Override
protected void onResume()
    super.onResume();
    if(mWebView != null)
        mWebView.onResume();
        mWebView.resumeTimers();
    

您可能对 WebView 中的 onPause 和 onResume 以及 pauseTimers/resumeTimers 方法感兴趣。

处理方向变化

如果您不希望在旋转屏幕时重新启动 Activity(这将阻止重新创建 WebView),那么只需放置

android:configChanges="orientation|screenSize|keyboardHidden|keyboard"

在您的 AndroidManifest 文件中的 Activity 的 <activity> 标记中。这不是一个正常遵循的好习惯,但是当您使用像 WebView 这样的复杂原生视图时,可以这样做(Android Web 浏览器使用它来避免在旋转时重新创建)。使用此标签时会发生什么情况,布局将仅调整大小以适应横向,您将必须手动处理使用资源中的 -port-land 文件夹处理的任何布局特定更改。如果您只使用一种布局,那么这不是问题。

请参阅this question/answer 了解更多信息,并注意不鼓励这样做,但它会起作用。

【讨论】:

谢谢你,我可能是愚蠢的,但这去哪里了?我在 if(savedInstanceState == null) 之后添加了 view.onpause 内容,但它只会导致空白屏幕。如果有帮助,我可以发布我的 MainActivity 的完整代码,以便您查看还有什么。 您应该将暂停代码放在您创建 WebView 的活动的 onPause 方法中。您可能只需将第二个 sn-p 中的代码直接放入您的 Activity 中,然后将对 mWebView 的引用替换为 this.view 或您命名的任何 WebView 变量,希望它会起作用。告诉我。 这对于最小化和恢复视频非常有用,并且完美暂停。但是,当你旋转时,你会留下一个空白屏幕,有没有办法让这个手柄旋转呢? @KelvinBrotherston 这实际上是一个单独的问题......听起来你在 Activity 重新启动时没有正确保存和恢复 WebView。尝试将android:configChanges="orientation|screenSize|keyboardHidden|keyboard" 放在 AndroidManifest 文件的 Activity 标记中,看看它是否能解决该问题。当您旋转时,它将阻止活动重新启动,如果您不关心纵向模式的不同布局,这很好。我已经用有关此的信息更新了我的答案。 为什么不在 onResume 方法中mWebView.onResume();【参考方案2】:

最小化应用时,您需要暂停webview。使用此代码暂停您的webview

Class.forName("android.webkit.WebView")
                        .getMethod("onPause", (Class[]) null)
                        .invoke(webview, (Object[]) null);

关于“即使您旋转手机也能播放视频”,这是功能而不是错误!

【讨论】:

嗨,对于旋转,我可能没有提到,但你看不到视频,它是隐藏的,所以它不能成为功能,因为运行你看不到的视频有什么意义?我会尝试 onPause。谢谢:) 你能贴一些横向模式的图片吗? 稍后会因为没有我的设备而做,基本上它会显示你所在的页面,嵌入的视频没有播放(如果你点击它,它会加载视频并启动它)但是视频您在旋转之前开始播放,您可以听到正在播放的音频,但在不终止应用程序的情况下无法播放或停止播放。 当暂停WebView的方法是公共API时,请不要使用反射暂停!这是不必要的,也是个坏主意。 @anthonycr 你会如何建议实现我需要的东西?编辑:刚刚看到它:)

以上是关于WebView - Youtube 视频在后台播放并最小化的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥 Youtube 视频没有在 webview android 中播放

Android webView 播放 YouTube 视频

Flutter WebView 插件无法播放某些 YouTube 视频

Android:在 Webview 上播放 youtube 视频

如何在我的应用程序中播放 Youtube 视频而不使用 Webview