如何在Android WebView中嵌入Youtube视频



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

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

为了处理这个错误,我决定使用Youtube API。

在这个库的可用实现之间,我尝试了以下几种:

  • 安卓API
  • Iframe API
  • Javascript API

安卓API的优点是,我可以播放具有上述限制的视频,但它被丢弃了,因为它的默认行为是当抽屉打开时,播放器停止视频。

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

我的最后一个尝试是使用Javascript API。目前,我遇到了与iframe相同的情况,即无法播放有限制的视频。

然而,我认为这是找到解决方案的正确方法。在api参考中,他们建议使用SWFObject,但据我所知,没有flah可用于移动设备,就像这个答案中公开的那样。那么,还有另一种方法可以在我的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>    

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

    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);

我认为,提出一个类似的问题可能会对您有所帮助,并且可能是一个很好的起点。但我将要发布的第二个链接可能会有更多帮助。

在Android WebView 中播放Youtube HTML5嵌入式视频

此外,我在另一个网站上发现了这条评论,这可能是你的神奇答案:

"你提到的自定义播放器很可能使用了一个众所周知的技巧:欺骗youtube提供该视频的MP4版本,逐步下载,并通过本地http服务器将其提供给MPMoviePlayerController。

该限制基于对访问有问题视频时使用的IP地址的反向查找。使用美国国内的代理,你会发现它突然间就没有任何问题了。"http://w3facility.org/question/embed-youtube-videos-with-contains-content-from-it-is-restricted-from-playback-on-certain-site/

我希望这能有所帮助!!

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

这是因为这个视频不是所有网站都可以播放的,所以如果你加载了一个本地html,"Referer"http头是空的,那么youtube就无法确定你的网站是否在禁止列表上。解决方案是把你的html放在你自己的网络服务器上,然后通过url加载,然后"Referer"标题将是你的网络服务器地址,问题就解决了。

相关内容

  • 没有找到相关文章

最新更新