YouTubevideo不能在WebView中播放 – Android

我正在绑定在WebView中播放YouTubevideo,WebView显示带有播放button的video的第一个视图,但点击播放button后,开始进度条,2-3秒后停止进度条和黑色的屏幕空白。

Image1:首先用播放button查看video

Image2:点击播放button后屏幕变空白。

请! 帮助我为什么video不能开始。

IMAGE:1 这是Web视图的第一眼看

IMAGE:2 在这里输入图像描述

这是我在webview中播放YouTubeVideo的源代码..请帮我…

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView wv = (WebView) findViewById(R.id.webView1); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setPluginsEnabled(true); final String mimeType = "text/html"; final String encoding = "UTF-8"; String html = getHTML(); wv.loadDataWithBaseURL("", html, mimeType, encoding, ""); } public String getHTML() { String html = "<iframe class=\"youtube-player\" style=\"border: 0; width: 100%; height: 95%; padding:0px; margin:0px\" id=\"ytplayer\" type=\"text/html\" src=\"http://www.youtube.com/embed/" + "J2fB5XWj6IE" + "?fs=0\" frameborder=\"0\">\n" + "</iframe>\n"; return html; } 

在将HTML内容加载到WebView之前添加这些行。

 wv.setWebChromeClient(new WebChromeClient() { }); 

从文档:

为了在您的应用程序中支持embedded式HTML5video,您需要打开硬件加速, 并设置WebChromeClient 。 对于全屏支持,onShowCustomView(View,WebChromeClient.CustomViewCallback)和onHideCustomView()的实现是必需的,getVideoLoadingProgressView()是可选的。

需要以下代码才能显示由Web核心框架启动的video播放器。 整个stream程的关键是VideoView被传回到WebChromeClient,并且您需要将该视图附加到您的视图层次结构中。

我已经通过查看作为AOSP一部分提供的浏览器源代码来组装它。

这段代码引用了4个可能不明显的视图。 视图层次是:

  • FrameLayout mContentView (root)
  • WebView mWebViewWebView mWebView子项)
  • FrameLAyout mCustomViewContainerFrameLAyout mCustomViewContainer子项)
  • View mCustomViewView mCustomView子项)

视图被configuration为设置容器活动的一部分。

 <FrameLayout android:id="@+id/fullscreen_custom_content" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF000000"/> <FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > <WebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout> </FrameLayout> 

在您的活动onCreate

  mContentView = (FrameLayout) findViewById(R.id.main_content); mWebView = (WebView) findViewById(R.id.webView); mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content); 

mWebView注册mWebView 。 该客户端应该重写以下2 – 4个方法:

 void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { // if a view already exists then immediately terminate the new one if (mCustomView != null) { callback.onCustomViewHidden(); return; } // Add the custom view to its container. mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER); mCustomView = view; mCustomViewCallback = callback; // hide main browser view mContentView.setVisibility(View.GONE); // Finally show the custom view container. mCustomViewContainer.setVisibility(View.VISIBLE); mCustomViewContainer.bringToFront(); } void onHideCustomView() { if (mCustomView == null) return; // Hide the custom view. mCustomView.setVisibility(View.GONE); // Remove the custom view from its container. mCustomViewContainer.removeView(mCustomView); mCustomView = null; mCustomViewContainer.setVisibility(View.GONE); mCustomViewCallback.onCustomViewHidden(); // Show the content view. mContentView.setVisibility(View.VISIBLE); } public Bitmap getDefaultVideoPoster() { if (mDefaultVideoPoster == null) { mDefaultVideoPoster = BitmapFactory.decodeResource(getResources(), R.drawable.default_video_poster); } return mDefaultVideoPoster; } public View getVideoLoadingProgressView() { if (mVideoProgressView == null) { LayoutInflater inflater = LayoutInflater.from(this); mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null); } return mVideoProgressView; } 

您可能还需要添加活动生命周期绑定,如:

 @Override protected void onStop() { super.onStop(); if (mCustomView != null) { if (mCustomViewCallback != null) mCustomViewCallback.onCustomViewHidden(); mCustomView = null; } } @Override public void onBackPressed() { if (mCustomView != null) { onHideCustomView(); } else { finish(); } } 

当您停止活动或按下后退button时,您的活动将使video隐藏起来。

添加webview.setWebChromeClient(new WebChromeClient()); 并为您的video添加插件

 if (Build.VERSION.SDK_INT < 8) { webview.getSettings().setPluginsEnabled(true); } else { webview.getSettings().setPluginState(PluginState.ON); } 

Thnaks

在移动设备上stream动的youtbevideo存在一些问题。 如果您直接尝试在networking视图中加载url并运行该url,则video将无法播放。 解决这个问题的一个难点就是在video视图中stream式传输video。 我没有尝试过,但可以做到这一点。
以其他方式播放YouTubevideo,我将这种更简单的方法称为将Web视图设置中的用户代理从移动设备更改为桌面。 用户代理指示YouTubevideo将运行的设备的types,并且相应地由服务器发送该types的网页。 这样YouTubevideo就可以stream式播放了。 这里是你如何做到这一点:

 public static final int USER_MOBILE = 0; public static final int USER_DESKTOP = 1; wv.getSettings().setUserAgent(USER_DESKTOP); // 1 is for the desktop 

我复制了askers代码,它为我工作….我想你必须安装Flash付款人..你呢? 并且你有没有添加互联网许可?

顺便说一句,我的代码在这里…

 package com.example.youtube; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import android.util.Log; import android.view.Menu; import android.view.Window; import android.view.WindowManager; import android.webkit.DownloadListener; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebChromeClient; import android.webkit.WebViewClient; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.AbsoluteLayout; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.os.AsyncTask; import android.util.Log; import android.widget.TextView; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; public class MainActivity extends Activity{ @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.activity_main); final ProgressBar Pbar; Pbar = (ProgressBar) findViewById(R.id.pB4); WebView wv = (WebView) findViewById(R.id.webVie1); //wv.setWebViewClient(new Callback()); WebSettings webSettings = wv.getSettings(); webSettings.setBuiltInZoomControls(true); webSettings.setJavaScriptEnabled(true); //wv.setBackgroundColor(0x919191); final String mimeType = "text/html"; final String encoding = "UTF-8"; String html = getHTML(); wv.loadDataWithBaseURL("", html, mimeType, encoding, ""); final Activity activity = this; wv.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% activity.setProgress(progress * 100); { if(progress < 100 && Pbar.getVisibility() == ProgressBar.GONE){ Pbar.setVisibility(ProgressBar.VISIBLE); } Pbar.setProgress(progress); if(progress == 100) { Pbar.setVisibility(ProgressBar.GONE); } } } }); wv.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_LONG).show(); } }); wv.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } }); } private String getHTML() { // TODO Auto-generated method stub String html1 = "<iframe class=\"youtube-player\" style=\"border: 0; width: 100%; height: 95%; padding:0px; margin:0px\" id=\"ytplayer\" type=\"text/html\" src=\"http://www.youtube.com/embed/" + "J2fB5XWj6IE" + "?fs=0\" frameborder=\"0\">\n" + "</iframe>\n"; return html1; } /* public void onPause() { super.onPause(); System.exit(0); }*/ } 

布局文件

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/page_buttons" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> <WebView android:id="@+id/webVie1" android:layout_width="316dp" android:layout_height="392dp" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_weight="0.99" /> <ProgressBar android:id="@+id/pB4" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"/> /> </LinearLayout> 

为什么你想在webview中播放你的video? 你可以使用这个意图来播放它

 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl))); 

否则,如果你想在webView中播放,请点击此链接

http://www.stackoverflow.com/questions/9565533/android-how-to-play-youtube-video-in-webview?rq=1

试试这一个

 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));