2012-08-17 74 views
3

我在尝试播放Android Web视图中的一些YouTube视频时遇到了很多麻烦。我到处搜索,但找不到可行的解决方案。在Android Webview中观看Youtube视频流很紧张

我使用下面的代码:

WebView mWebView = (WebView) findViewById(R.id.webView1); 
//Setup Webview 
WebChromeClient client= new WebChromeClient(); 
mWebView.setWebChromeClient(client); 

mWebView.getSettings().setPluginsEnabled(true); 
mWebView.getSettings().setSupportZoom(false); 
mWebView.getSettings().setJavaScriptEnabled(true); 
mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); 
mWebView.getSettings().setAllowFileAccess(true); 

mWebView.loadDataWithBaseURL("www.youtube.com", "<iframe class=\"youtube-player\" type=\"text/html\" width=\"640\" height=\"385\" src=\"http://www.youtube.com/embed/JEkbk-xDmZE?html5=1\" frameborder=\"0\">\n</iframe>", "text/html", "UTF-8", ""); 

这个问题似乎只有这样一个特定的流:http://www.youtube.com/watch?v=JEkbk-xDmZE

声音是伟大的,但视频是非常缓慢的,像1帧每秒。不可观看。

但是,如果我用这个流:http://www.youtube.com/watch?v=GDFIYKmNw9Q

它完美的罚款。

这些直播视频流和我如何获得第一个正确播放有什么区别? 另外我应该提一下,有时第一个玩的很好。我无法弄清楚它为什么有时会播放,而其他时间则不会。我已经尝试创建一个新项目,几乎只有一个Webview和一个Factory Reset设备,以消除任何可能影响此设置的设置,但我仍然遇到问题。

+0

您是否找到适合您的问题的解决方案? – edwin 2013-01-05 09:02:01

回答

7

我一直在努力尝试使用YouTube在YouTube上工作。为什么某些视频滞后于我,但它可能是不同的质量设置和有限的带宽,因此它的缓冲。

希望下面的选项之一可能会有所帮助,如果它不是一个缓冲问题。

目前,您可以使用WebView或者使用IFrame或YouTube API。否则,您可以使用GData API来获取视频的RSTP链接以用于VideoView。最后,您可以使用意图启动YouTube应用。

未来会有一个适用于YouTube的新API。但它尚未发布。主题再次既不具有在12月2011.宣布了谷歌地图,片段支持 - 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 - 好多了,但需要闪光灯。因此,“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

意图 - 启动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; 
    } 
} 
+1

在Nexus 7上,我们看到灰色屏幕上有一个破损的电影卷轴的白色图像。 'webView.setWebChromeClient(新的WebChromeClient());'修复了这个问题。谢谢 – christophercotton 2012-10-02 02:47:30

+0

我确信我尝试过,但它从来没有帮助过。当下一次回到Android客户端时,我不得不放弃它。干杯 – JonWillis 2012-10-03 11:16:17

+0

另外,我们使用'youtbue.com/embed /'代替'youtube.com/v /',因为那样会使用HTML5而不是flash。 – christophercotton 2012-10-03 20:13:31

相关问题