Vidéo YouTube ne jouant pas dans WebView-Android

j'essaie de lire une vidéo YouTube dans WebView, WebView montrant le premier regard de la vidéo avec le bouton Lecture, mais après avoir cliqué sur le bouton Lecture démarrer la barre de progression et après 2-3 secondes arrêter la barre de progression et l'écran blanc avec la couleur Noire.

Image1: premier regard vidéo avec le bouton Lecture

Image2: après avoir cliqué sur le bouton play l'écran devient vide.

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

IMAGE:1 This is first look of web view

IMAGE: 2 enter image description here

c'est mon code source pour jouer YouTubeVideo dans webview.. S'il vous plaît aider 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;
}
42
demandé sur 4castle 2012-10-03 16:50:46

7 réponses

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 inline HTML5 dans votre application, vous devez avoir une accélération matérielle activée, et définir un WebChromeClient . Pour le support plein écran, implémentations de onShowCustomView (View, WebChromeClient.CustomViewCallback) et onHideCustomView() sont nécessaires, getVideoLoadingProgressView () est optionnel.

66
répondu Łukasz Sromek 2012-10-05 18:09:13

Le code suivant est nécessaire pour montrer le lecteur vidéo qui est lancé par le web framework. La clé de tout le flux est que la vue vidéo est transmise de nouveau au WebChromeClient et vous devez attacher cette vue à votre hiérarchie de vue.

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

ce code renvoie à 4 Vues qui peuvent ne pas être évidentes. Le voir la hiérarchie est:

  • 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 mise en place 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 le cadre de 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);

Enregistrer un WebChromeClient avec mWebView . Ce client devrait outrepasser les méthodes 2-4 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 aussi ajouter des fixations du cycle de vie de l'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é de faire cacher la vidéo lorsque l'activité est arrêtée ou le bouton arrière est appuyé.

17
répondu Nick Campion 2014-03-31 07:37:05

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

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

Thnaks

12
répondu Siddharth_Vyas 2013-02-07 04:45:58

il y a un problème avec les vidéos de youtbe diffusées sur les appareils mobiles. Si vous essayez directement de charger L'URL dans la vue web et l'exécuter, alors la vidéo ne sera pas jouée. Une façon difficile de résoudre ce problème est de diffuser la vidéo dans la vue vidéo. Je n'ai pas essayé cela, mais cela peut être fait.

autre façon de lire les vidéos youtube, je vais appeler cela la manière la plus facile est de changer l'agent utilisateur dans les paramètres de vue web de l'appareil mobile à un bureau. Utilisateur agent indique le type d'appareil sur lequel la vidéo youtube va s'exécuter et en conséquence ce type de page web est envoyé par le serveur. De cette façon, la vidéo youtube peut être écouté et joué. Voici comment vous pouvez faire cela:

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
répondu karn 2012-10-09 18:43:31

j'ai copié le code askers et ça a marché pour moi.... je pense que tu dois installer flash payer.. di u?? et avez-vous ajouté la permission 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
répondu Bilal Ahmed 2013-04-27 14:48:10

Pourquoi voulez-vous lire votre vidéo dans webview? Vous pouvez le jouer en utilisant cette intention

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

Sinon si vous voulez le lire dans webView suivez ce lien

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

0
répondu sai 2012-10-11 17:32:20

Essayer celui-ci

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));
0
répondu Salman Ashraf 2013-01-24 12:48:38