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
IMAGE: 2
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;
}
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.
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é.
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
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
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>
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
Essayer celui-ci
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));