【问题标题】:How to embed Youtube video in Android WebView?如何在 Android WebView 中嵌入 Youtube 视频?
【发布时间】:2015-05-30 04:10:18
【问题描述】:

我想在我的 Android 应用中嵌入一个 youtube 视频。它有一个Navigation Drawer,当这个抽屉打开时,视频必须继续播放。我希望我的应用能够播放有版权限制的视频,例如来自Vevo 的视频。我的第一次尝试是使用 Chrome 客户端在 WebView 中简单地加载嵌入 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

在这个库的可用实现之间,我尝试了这些:

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

使用 iframe API,我可以在抽屉打开时播放视频,但没有限制。

我最后的尝试是使用 Javascript API。目前我的情况和iframe一样,就是不能播放有限制的视频。

但是我认为这是找到解决方案的正确方法。在api reference 中,他们推荐使用SWFObject,但据我所知,没有可用于移动设备的flah,例如this answer 中的暴露。那么,还有另一种在我的 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>    

【问题讨论】:

    标签: javascript android html iframe youtube-api


    【解决方案1】:

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

    Play Youtube HTML5 embedded Video in Android WebView

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

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

    此限制基于您在访问相关视频时使用的 IP 地址的反向查找。使用美国境内的代理,您会发现它突然播放没有任何问题。”http://w3facility.org/question/embed-youtube-videos-with-contains-content-from-it-is-restricted-from-playback-on-certain-site/

    希望对你有帮助!!

    【讨论】:

    • 放弃下载选项,因为我需要像在youtube中一样显示视频,即连广告都显示。根据stackoverflow.com/a/5719200/1771682 中的答案,没有合法的方式可以以编程方式更改您的 webview 代理设置,我想做一些合法的事情。
    【解决方案2】:

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

    这是因为这个视频不是所有网站都可以播放的,所以如果你加载一个本地的html,“Referer”http头是空的,那么youtube就无法判断你的网站是否在禁止列表中。解决办法就是把你的html放到你自己的web服务器上,然后通过url加载,然后“Referer”头就是你的web服务器地址,问题就解决了。

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 经过近 2 小时的搜索,这是唯一对我有用的解决方案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多