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
IMAGE: 2
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;
}
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.
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é.
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
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
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>
ma vue Web avait activé javascript mais la suppression a fait fonctionner la vidéo
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
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