我想在我的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"标题将是你的网络服务器地址,问题就解决了。