总的来说,我一直在努力使用 YouTube,试图让它在 android 上运行。为什么某些视频滞后我无法理解,但它可能是不同的质量设置和有限的带宽,因此它的缓冲。
如果不是缓冲问题,希望以下选项之一可能会有所帮助。
目前,对于 WebView,您可以使用 IFrame 或 YouTube API。否则,您可以使用 GData API 获取指向视频的 RSTP 链接,以便在 VideoView 中使用。最后,您可以使用 Intent 启动 YouTube 应用。
将来会有一个新的适用于 YouTube 的 Android API。但它尚未发布。主题同样也不支持 2011 年 12 月宣布的对谷歌地图的片段支持。 - http://www.youtube.com/watch?v=3WFsx-u-q3Y
下面的优点/缺点(示例都是使 WebView 填充 100% 的屏幕高度和宽度)
WebView - IFrame - 可用的有限配置。在 WebView 中运行并适用于几乎所有平台。不要误会我的意思,有时不同的选项不起作用,并且当您尝试播放视频时会得到灰色背景。使用以下站点创建 IFrame 代码并尝试不同的选项,直到它适合您 - https://developers.google.com/youtube/youtube_player_demo(请注意一些允许的配置选项不起作用,例如隐藏控件没有效果)。如前所述,有很多不同的选择,因此涉及反复试验。虽然有几个不起作用,但有些看起来完全不同。查看您的问题,我以前从未使用过 html5=1 选项,也从未将 youtube.com 设置为基本网址。
webView = new WebView(this);
webView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.getSettings().setJavaScriptEnabled(true);
// Prevent scrolling of the webview
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
webView.setWebChromeClient(new WebChromeClient()); //Blank webview to prevent null pointer plugin issues
webView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
});
String data = "<html>"+
"<head>"+
"</head>"+
"<body style=\"margin: 0; padding: 0\">"+
"<iframe " +
"type=\"text/html\" "+
"class=\"youtube-player\" "+
"width=\"100%25\" "+
"height=\"100%25\" "+
"src=\"http://www.youtube.com/v/" + uri +
"?controls=0&showinfo=0&showsearch=0&modestbranding=1&fs=0\" "+
"frameborder=\"0\"></iframe>" +
"</body>"+
"</html>";
webView.loadData(data, "text/html", "utf-8");
WebView - YouTube API - 更好,但需要 Flash。因此,“Nexus 7”和任何未来随 JellyBean(4.1 及更高版本)发布的设备都将无法工作。由于这些设备上的 WebView 使用的是精简版的 Chrome,而不是精简版的 WebBrowser。因此,正如我昨天发现的那样,以后不能在我们的应用程序上使用它。
webView = new WebView(this);
webView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.getSettings().setJavaScriptEnabled(true);
// Prevent scrolling of the webview
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
webView.setWebChromeClient(new WebChromeClient()); //Blank webview to prevent null pointer plugin issues
webView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
});
String data = "<!DOCTYPE HTML>" + "<html>" + "<body style=\"margin: 0; padding: 0\">"
+ "<div id=\"player\"></div>"
+ "<script>"
+
// Load player api asynchronously.
"var tag = document.createElement('script');" + "tag.src = \"http://www.youtube.com/player_api\";"
+ "var firstScriptTag = document.getElementsByTagName('script')[0];" + "firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);"
+ "var done = false;" + "var player;" + "function onYouTubePlayerAPIReady() {" + "player = new YT.Player('player', {" + "height: '100%25',"
+ "width: '100%25'," + "videoId: '"
+ uri
+ "',"
+ "playerVars: { 'controls': "
+ controls
+ ", 'showinfo': 0, 'fs':0, 'modestbranding':1 },"
+ "events: {"
+ "'onReady': onPlayerReady," + "'onStateChange': onPlayerStateChange" + "}" + "});" + "}" + "function onPlayerReady(evt) {" +
// Autoplay
"evt.target.playVideo();" + "}" + "function onPlayerStateChange(evt) {" +
"}" + "function stopVideo() {" + "player.stopVideo();" + "}" + "</script>" + "</body>" + "</html>";
webView.loadData(data, "text/html", "utf-8");
VideoView - YouTube 数据 API - 可以访问信息并重要地链接到视频流以在 VideoView 中使用。缺点是免费 API 仅限于低质量 3GP 视频,而不是 MP4(高质量/高清)流。- https://developers.google.com/youtube/getting_started#data_api
Intent - 启动 YouTube - 打开包含您要播放的视频的 YouTube 应用程序。缺点是打开了另一个应用程序,因此没有嵌入到您的应用程序中,并且某些设备没有安装 YouTube。
if (AppChecker.isAppInstalled("com.google.android.youtube", this) == true)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + uri));
startActivity(intent);
}
else
{
//Show youtube not installed
}
//Code to check if YouTube is installed.
public class AppChecker
{
public static boolean isAppInstalled(String uri, Activity activity)
{
PackageManager pm = activity.getApplicationContext().getPackageManager();
boolean app_installed = false;
try
{
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
app_installed = true;
}
catch (PackageManager.NameNotFoundException e)
{
app_installed = false;
}
return app_installed;
}
}