如何在Android WebView中嵌入YouTube视频?

6
我想在我的Android应用中嵌入一个YouTube视频。它有一个导航抽屉,当打开此抽屉时,视频必须继续播放。我希望我的应用程序能够播放受版权限制的视频,例如Vevo的视频。我的第一次尝试是在WebView中使用Chrome客户端加载嵌入式URL(https://www.youtube.com/embed/VIDEO_ID),但对于许多视频,例如来自Vevo的视频,如this,我看到这个消息:

This Video Contains content from Vevo. It is restricted from playback on certain sites

为了处理这个错误,我决定使用Youtube API
在这个库的可用实现之间,我尝试了以下内容:

安卓API有一个优点,就是可以在提到的限制下播放视频,但因为其默认行为是当抽屉被打开时停止播放,所以被舍弃了。

使用Iframe API,我可以在抽屉打开时播放视频,但不能限制。

我的最后一次尝试是使用Javascript API。目前,我和使用Iframe API时一样,无法受到限制地播放视频。

然而,我认为这是找到解决方案的正确方法。在API参考中,他们建议使用SWFObject,但据我所知,移动设备上没有可用的Flash,就像这个答案中所述的那样。那么,在我的WebView中嵌入视频还有其他方法吗?
另一个疑问是:移动网站如何播放来自YouTube的视频,即使有“特定网站”限制?请理解这里提问的是一个不太熟悉JavaScript的Android开发人员。
目前,我有这段代码:
要加载播放器的布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

填充此布局的片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment, null);

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

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    webView.loadUrl("file:///android_asset/player_webview.html");
    webView.setWebViewClient(new CustomClient());

    return view;
}

private class CustomClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webview, String url) {
        webview.setWebChromeClient(new WebChromeClient());
        webview.loadUrl(url);
        return true;
    }
}

HTML文件

<!DOCTYPE html>
<html>
<head>

  <script type="text/javascript" src="./swfobject/swfobject.js"></script>

  <div id="ytapiplayer">
      You need Flash player 8+ and JavaScript enabled to view this video.
  </div>

  <script type="text/javascript">

    var params = { allowScriptAccess: "always" };
    var atts = { id: "myytplayer" };
    swfobject.embedSWF("http://www.youtube.com/v/G90AgiAMM6k?enablejsapi=1&playerapiid=ytplayer&version=3",
                       "ytapiplayer", "425", "356", "8", null, null, params, atts);

  </script>
</head>
</html>    
3个回答

3

对于我的情况,针对Android 4.4.4,在loadDataWithBaseURL()的第一个参数中添加Referer头"https://www.youtube.com"拯救了我的一天!

    mWebView = (WebView) getActivity().findViewById(R.id.webView);

    if (Build.VERSION.SDK_INT < 8) {
        mWebView.getSettings().setPluginsEnabled(true);
    } else {
        mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
    }

    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setLoadWithOverviewMode(true);
    mWebView.setWebViewClient(new WebViewClient());
    mWebView.setBackgroundColor(0x00000000);
    mWebView.getSettings().setBuiltInZoomControls(true);
    String html = "<iframe height='95%' width='100%' src='" + videoURL + "' frameborder='0' allowfullscreen></iframe>";
    mWebView.loadDataWithBaseURL("https://www.youtube.com", html, "text/html", "UTF-8", null);

这是我在寻找近两个小时后找到的唯一可行的解决方案。谢谢! - jbc25

2
我认为,之前有人提出的类似问题可能对您有所帮助,也可以作为一个好的起点。但我将发布的第二个链接可能会更有帮助。
“在Android WebView中播放Youtube HTML5嵌入式视频” Play Youtube HTML5 embedded Video in Android WebView 此外,我在另一个网站上找到了这条评论,可能是您需要的答案:
“你提到的自定义播放器很可能使用了一个相当著名的技巧;欺骗youtube提供该视频的MP4版本,逐步下载并通过本地http服务器返回给MPMoviePlayerController。
限制基于访问相关视频时使用的IP地址的反向查找。使用来自美国的代理,您将看到它突然没有任何问题。” http://w3facility.org/question/embed-youtube-videos-with-contains-content-from-it-is-restricted-from-playback-on-certain-site/ 希望这可以帮助到您!

1
下载选项被舍弃了,因为我需要像在YouTube中一样展示视频,即展示广告。根据https://dev59.com/wm855IYBdhLWcg3wMBLV#5719200中的答案,没有合法的方法可以通过编程方式更改您的webview代理设置,而我想做一些合法的事情。 - androidevil

1

我最近遇到了同样的问题并解决了它,希望能有所帮助。

这是因为该视频无法在所有网站上播放,因此如果您加载本地html,则“Referer” http标头为空,然后youtube无法确定您的网站是否在被禁止的列表中。解决方案就是将您的html放在自己的web服务器上,然后通过url加载它,然后“Referer”标头将是您的web服务器地址,问题得以解决。


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