web-dev-qa-db-fra.com

Vidéo YouTube non lue dans WebView - Android

Je tente de lire une vidéo YouTube dans WebView, WebView montrant le premier aperçu de la vidéo avec le bouton de lecture, mais après avoir cliqué sur le bouton de lecture, démarrez la barre de progression et après 2-3 secondes, arrêtez la barre de progression et l'écran vide avec une couleur noire.

Image1: Premier aperçu de la vidéo avec le bouton de lecture

Image2: Après avoir cliqué sur l'écran du bouton de lecture devient vide.

S'il vous plaît! aidez-moi pourquoi la vidéo ne démarre pas.

IMAGE: 1 This is first look of web view

IMAGE: 2 enter image description here

Ceci est mon code source pour lire YouTubeVideo en affichage Web .. S'il vous plaît, aidez-moi ...

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;
}
44
Ranjit Chandel

Ajoutez ces lignes avant de charger du contenu HTML dans votre WebView.

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

De la documentation:

Afin de prendre en charge la vidéo HTML5 en ligne dans votre application, vous devez activer l'accélération matérielle, et définir un WebChromeClient. Pour la prise en charge plein écran, les implémentations de onShowCustomView (View, WebChromeClient.CustomViewCallback) et onHideCustomView () sont requises, getVideoLoadingProgressView () est facultatif.

70
Łukasz Sromek

Le code suivant est nécessaire pour afficher le lecteur vidéo démarré par le framework Web Core. La clé de l'ensemble du flux est que la VideoView est retransmise au WebChromeClient et vous devez attacher cette vue à votre hiérarchie de vues.

Je l'ai assemblé en examinant le code source du navigateur disponible dans le cadre de l'AOSP.

Ce code fait référence à 4 vues qui peuvent ne pas être évidentes. La hiérarchie des vues est la suivante:

  • FrameLayout mContentView (racine)
  • WebView mWebView (enfant de mContentView)
  • FrameLAyout mCustomViewContainer (enfant de mContentView)
  • View mCustomView (enfant de mCustomViewContainer)

Les vues sont configurées dans le cadre de la configuration de l'activité de conteneur.

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

Dans vos activités onCreate:

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

Enregistrez un WebChromeClient avec mWebView. Ce client doit remplacer les 2 à 4 méthodes suivantes:

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

Vous pouvez également ajouter des liaisons de cycle de vie d'activité comme:

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

À votre activité pour masquer la vidéo lorsque l'activité est arrêtée ou lorsque le bouton Retour est enfoncé.

18
Nick Campion

Ajoutez webview.setWebChromeClient(new WebChromeClient()); et pour activer les plugins pour votre vidéo, ajoutez

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

Thnaks

12
Siddharth_Vyas

Il y a un problème avec les vidéos youtbe diffusées sur les appareils mobiles. Si vous essayez directement de charger l'URL dans la vue Web et de l'exécuter, la vidéo ne sera pas lue. Une façon difficile de résoudre ce problème consiste à diffuser la vidéo dans la vue vidéo. Je n'ai pas essayé cela mais cela peut être fait.
. L'agent utilisateur indique le type d'appareil sur lequel la vidéo youtube s'exécutera et, en conséquence, ce type de page Web est envoyé par le serveur. De cette façon, la vidéo youtube peut être diffusée et lue. Voici comment procéder:

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

J'ai copié le code des demandeurs et cela a fonctionné pour moi .... je pense que vous devez installer le payeur flash .. di u ?? et avez-vous ajouté une autorisation Internet ???

btw mon code est ici ...

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);
    }*/




}

fichier de mise en page

<?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>
2
Bilal Ahmed

ma vue Web avait activé javascript mais la suppression a fait fonctionner la vidéo

        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
0
Vihaan Verma

Pourquoi voulez-vous lire votre vidéo tube dans la vue Web? Vous pouvez y jouer en utilisant cette intention

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

Sinon, si vous voulez y jouer dans webView, suivez ce lien

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

0
sai