Video de YouTube no se reproduce en WebView – Android

Estoy tratando de reproducir videos de YouTube en WebView, WebView mostrando el primer aspecto del video con el botón Reproducir, pero luego de hacer clic en el botón Reproducir inicio la barra de progreso y luego de 2-3 segundos dejo la barra de progreso y la pantalla en blanco con el color negro.

Imagen 1: Primer vistazo de video con el botón de reproducción

Imagen 2: después de hacer clic en la pantalla del botón de reproducción se queda en blanco.

¡Por favor! ayúdame por qué el video no comienza.

IMAGEN: 1 Este es el primer aspecto de la vista web

IMAGEN: 2 enter image description here

Este es mi código fuente para reproducir YouTubeVideo en la vista web. Por favor, ayúdenme …

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 = "\n" + "\n"; return html; } 

Agregue estas líneas antes de cargar contenido HTML a su WebView.

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

De la documentación:

Para admitir video HTML5 en línea en su aplicación, necesita tener activada la aceleración de hardware y configurar un WebChromeClient . Para soporte de pantalla completa, se requieren implementaciones de onShowCustomView (View, WebChromeClient.CustomViewCallback) y onHideCustomView (), getVideoLoadingProgressView () es opcional.

El siguiente código es necesario para mostrar el reproductor de video que inicia el núcleo del marco web. La clave de todo el flujo es que VideoView se transfiere a WebChromeClient y debe adjuntar esa vista a su jerarquía de vistas.

Lo he reunido revisando el código fuente del navegador disponible como parte del AOSP.

Este código hace referencia a 4 vistas que pueden no ser obvias. La jerarquía de vista es:

  • FrameLayout mContentView (root)
  • WebView mWebView (hijo de mContentView)
  • FrameLAyout mCustomViewContainer (hijo de mContentView)
  • View mCustomView (hijo de mCustomViewContainer)

Las vistas se configuran como parte de la configuración de la actividad del contenedor.

      

En sus actividades onCreate :

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

Registre un WebChromeClient con mWebView . Ese cliente debe anular los siguientes 2 a 4 métodos:

 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; } 

Es posible que también desee agregar enlaces de ciclo de vida de la actividad como:

 @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(); } } 

A su actividad para ocultar el video cuando se detiene la actividad o se presiona el botón Atrás.

Agregar webview.setWebChromeClient(new WebChromeClient()); y para habilitar complementos para su video agregar

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

Thnaks

Existe algún problema con los videos youtbe transmitidos en los dispositivos móviles. Si intenta cargar directamente la URL en la vista web y ejecutarla, el video no se reproducirá. Una forma difícil de resolver este problema es transmitir el video en la vista de video. No lo he intentado pero esto puede hacerse.
Otra forma de reproducir los videos de YouTube, voy a llamar a esto de la manera más fácil es cambiar el agente de usuario en la configuración de vista web desde un dispositivo móvil a un escritorio. El agente de usuario indica el tipo de dispositivo en el que se ejecutará el video de youtube y, en consecuencia, el servidor envía ese tipo de página web. De esta manera, el video de youtube se puede transmitir y reproducir. Aquí es cómo puedes hacer esto:

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

Copié el código de askers y funcionó para mí … creo que tienes que instalar flash payer … di u ?? y agregaste un permiso de internet?

Por cierto, mi código está aquí …

 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 = "