如何在Webview Android中自动播放iframe YouTube

6

我在我的应用程序中使用 Android WebView 来显示来自 YouTube 的视频,目前可以正常工作。

但是我希望它自动播放。

这是我的活动,我将 "?autoplay=1" 添加到 videoUrl,但没有任何变化,它仍然不能自动播放。

public class LandVideoAct extends Activity {
    WebView mWebView;
    String videoURL = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.landfull);
        videoURL = "http://www.youtube.com/embed/VYIi49czywo?autoplay=1";
        mWebView = (WebView) findViewById(R.id.fullwebview);

        String vid = "<html><body style=\"margin: 0; padding: 0\"><iframe  width=\"100%\" height=\"100%\" src=\""+videoURL+"\" type=\"text/html\" frameborder=\"0\"></iframe><body><html>";

        WebChromeClient mWebChromeClient = new WebChromeClient(){
            public void onProgressChanged(WebView view, int newProgress) {
            }
        };

        mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
        mWebView.setWebChromeClient(mWebChromeClient);
        mWebView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                mWebView.loadUrl("javascript:(function() { document.getElementsByTagName('video')[0].play(); })()"); 
            }
        });
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.setInitialScale(1);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        if (Build.VERSION.SDK_INT < 17) {
            Log.i("GPSNETWORK", "<17");
        } else {
            Log.i("GPSNETWORK", Build.VERSION.SDK_INT+">=17");
            mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
        }
        mWebView.loadData(vid, "text/html", "UTF-8");
    }
}
8个回答

5

请查看这个问题。有一些建议可能适用于您,但是提问者没有说明是否有效。

大部分文章中都说,为了避免糟糕的用户体验,大多数移动平台都会阻止自动播放。

您可以尝试以下 JavaScript 代码:

var myvideo = document.getElementsByTagName('video')[0]; myvideo.play();

如果您使用的是Android 4.2.2及以上版本,请在您的本地代码中添加以下内容:

WebView.getSettings().setMediaPlaybackRequiresUserGesture(false);

同时也请查看此页面,其中添加了以下代码以自动播放视频:

webview.setWebViewClient(new WebViewClient() {
        // autoplay when finished loading via javascript injection
        public void onPageFinished(WebView view, String url) { webview.loadUrl("javascript:(function() { document.getElementsByTagName('video')[0].play(); })()"); }
    });
    webview.setWebChromeClient(new WebChromeClient());

    webview.loadUrl("http://html5demos.com/video");
}

1
我尝试按照您的建议进行操作,但仍然无法自动播放。请查看我的问题,我已经编辑并使用了您的建议。我检查了我的SDK版本是18。 - user2955394
@user2955394 - 你解决了这个问题吗? - Jaydev

2

1
Youtube对移动设备的限制使得自动播放音频和视频变得不可能。因此,请将用户代理设置为Web视图设置:
webSettings.userAgentString = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36"

这是我关于 Web View 的所有设置:

val webSettings = webView.settings
    webSettings.userAgentString = USER_AGENT
    webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)
    webSettings.javaScriptEnabled = true

    webSettings.displayZoomControls = false
    webSettings.builtInZoomControls = true
    webSettings.loadWithOverviewMode = true
    webSettings.setSupportZoom(false)

    webSettings.domStorageEnabled = true
    webSettings.allowFileAccess = true
    webSettings.allowContentAccess = true
    webSettings.javaScriptCanOpenWindowsAutomatically = true

    webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
    webSettings.cacheMode = WebSettings.LOAD_NO_CACHE

    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
    CookieManager.getInstance().setAcceptCookie(true)

    webSettings.mediaPlaybackRequiresUserGesture = false

    // Automatic screen
    // Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport
    webSettings.useWideViewPort = true

希望能对你有所帮助。


0
这段代码可以解决问题,我使用的是jQuery,但也可以用纯JavaScript实现。
<iframe id="myvideo" src="https://www.youtube-nocookie.com/embed/Vhh_GeBPOhs?autoplay=1&amp;rel=0&amp;controls=0&amp;showinfo=0&amp;rel=0&amp;loop=1&amp;modestbranding=1&amp;wmode=transparent&amp;mute=1amp;enablejsapi=1" width="560" height="315" frameborder="0" allowfullscreen></iframe>
<script>
setInterval(function(){
  $('#myvideo')[0].contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*');
 }, 250);
</script>

0
这样做。希望能帮到你。
String html = "<iframe class=\"youtube-player\" style=\"border: 0; width: 100%; height: 95%; padding:0px; margin:0px\" id=\"ytplayer\" type=\"text/html\" src=\"http://www.youtube.com/embed/"
                + "J2fB5XWj6IE?autoplay=1"
                + "&fs=0\" frameborder=\"0\">\n"
                + "</iframe>\n";

从下面的链接中:

在Chrome中,自动播放也被禁用了

(https://code.google.com/p/chromium/issues/detail?id=159336)

我相信在最新版本的默认Android Web浏览器中也会发生同样的情况。


谢谢你,但对我没有用(没有错误,但仍然不能自动播放)。 - user2955394
当我运行我的应用程序时,视频显示播放按钮,当我点击播放按钮时,它可以正常工作。但是我想要自动播放,而不需要点击播放按钮。 - user2955394

0

它基于操作系统原因默认处于禁用状态。Chrome也默认禁用内容。您可以尝试编写自己的应用程序,或者使用Java、Javascript和YouTube-API。也许在未来的webkit中,您将被允许根据电池状态决定播放什么。


-1

在WebView上使用桌面模式。Youtube将自动播放。添加以下内容:

webView.getSettings().setUserAgentString("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36")

像这样:

val webView: WebView = findViewById(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.loadUrl("http://your.web.site/")
webView.webChromeClient = object : WebChromeClient() {}
webView.settings.setPluginState(WebSettings.PluginState.ON)
webView.settings.setPluginState(WebSettings.PluginState.ON_DEMAND)
webView.settings.setUserAgentString("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36")
if(android.os.Build.VERSION.SDK_INT>16){webView.settings.setMediaPlaybackRequiresUserGesture(false)}
webView.webViewClient = object : WebViewClient() {
    override fun onPageFinished(webView: WebView, url: String) {
        super.onPageFinished(webView, url)
    }
}

-2
有点晚了,但我希望这可以帮到你。
在你的页面加载完成后运行以下代码:
 yourWebView.loadUrl("javascript:(function() { document.getElementsByClassName('ytp-large-play-button ytp-button')[0].click(); })()");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接