3

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 とファクトリー リセット デバイスだけで新しいプロジェクトを作成しようとしましたが、それでも問題が発生します。

4

1 に答える 1

7

私は一般的にYouTubeに苦労しており、Androidで動作させようとしています。なぜ特定のビデオが遅れるのかは私にはわかりませんが、品質設定が異なり、帯域幅が制限されているため、バッファリングが原因である可能性があります.

バッファリングの問題でない場合は、以下のオプションのいずれかが役立つことを願っています。

現在、WebView では、IFrame または YouTube API のいずれかを使用しています。それ以外の場合は、GData API を使用して、VideoView で使用するビデオへの RSTP リンクを取得できます。最後に、インテントを使用して YouTube アプリを起動できます。

将来的には、YouTube 用の Android 用の新しい API があります。しかし、それはリリースされていません。テーマには、2011 年 12 月に発表された Google マップの Fragment サポートもありません。 - 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 をベース URL として設定したりしたことがありません。

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 は、WebBrowser のカット ダウン バージョンではなく、Chrome のカット ダウン バージョンを使用するためです。そのため、昨日分かったように、今後これを当社のアプリで使用することはできません。

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 Data API - VideoView で使用するビデオ ストリームへの情報と重要なリンクへのアクセスを取得できます。欠点は、無料の API が MP4 (高品質/HD) ストリームではなく、品質の低い 3GP ビデオに限定されていることです。- 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;
    }
}
于 2012-09-18T09:16:35.450 に答える