Видео YouTube не воспроизводится в WebView - Android
Я привязываюсь к воспроизведению видео на YouTube в WebView, WebView показывает первый вид видео с кнопкой воспроизведения. Но после того, как вы нажмете на кнопку запуска кнопки воспроизведения, и через 2-3 секунды остановите индикатор выполнения и экран пустым с черным цветом.
Изображение1: первый просмотр видео с кнопкой воспроизведения
Изображение2: после щелчка по экрану кнопки воспроизведения становится пустым.
Пожалуйста! помогите мне, почему видео не запускается.
ИЗОБРАЖЕНИЕ: 1 ![This is first look of web view]()
ИЗОБРАЖЕНИЯ: 2
![enter image description here]()
Это мой исходный код для воспроизведения YouTubeVideo в веб-просмотре. Пожалуйста, помогите мне...
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;
}
Ответы
Ответ 1
Добавьте эти строки перед загрузкой содержимого HTML в ваш WebView.
wv.setWebChromeClient(new WebChromeClient() {
});
Из документации:
Чтобы поддерживать встроенное видео HTML5 в вашем приложении, вам необходимо включить аппаратное ускорение, и установить WebChromeClient. Для полноэкранной поддержки необходимы реализации onShowCustomView (View, WebChromeClient.CustomViewCallback) и onHideCustomView(), getVideoLoadingProgressView() является необязательным.
Ответ 2
Следующий код необходим для показа видеопроигрывателя, запускаемого каркасом веб-ядра. Ключом к всему потоку является то, что VideoView передается обратно в WebChromeClient, и вам нужно прикрепить этот вид к своей иерархии представлений.
Я собрал его, просмотрев исходный код браузера, доступный как часть AOSP.
Этот код ссылается на 4 вида, которые могут быть не очевидны. Иерархия представления:
-
FrameLayout mContentView
(root)
-
WebView mWebView
(дочерний элемент mContentView)
-
FrameLAyout mCustomViewContainer
(дочерний элемент mContentView)
-
View mCustomView
(дочерний элемент mCustomViewContainer)
Представления настраиваются как часть настройки активности контейнера.
<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>
В ваших действиях onCreate
:
mContentView = (FrameLayout) findViewById(R.id.main_content);
mWebView = (WebView) findViewById(R.id.webView);
mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);
Зарегистрируйте a WebChromeClient
с помощью mWebView
. Этот клиент должен переопределить следующие 2 - 4 метода:
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;
}
Вы также можете добавить привязки жизненного цикла активности, например:
@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();
}
}
В свою активность, чтобы сделать видео скрытым, когда действие остановлено или нажата кнопка "Назад".
Ответ 3
Добавьте webview.setWebChromeClient(new WebChromeClient());
и включите плагины для вашего видео.
if (Build.VERSION.SDK_INT < 8) {
webview.getSettings().setPluginsEnabled(true);
} else {
webview.getSettings().setPluginState(PluginState.ON);
}
Thnaks
Ответ 4
Есть некоторая проблема с видео youtbe, транслируемым на мобильных устройствах. Если вы попытаетесь загрузить URL-адрес в веб-представление и запустите его, видео не будет воспроизводиться. Одним из трудных способов решения этой проблемы является потоковое видео в виде видео. Я не пробовал это, но это можно сделать.
Другой способ воспроизведения видео с YouTube, я назову это, проще всего изменить пользовательский агент в настройках веб-представления с мобильного устройства на рабочий стол. Пользовательский агент указывает тип устройства, на котором будет запускаться видео YouTube, и, соответственно, какой-либо веб-сайт отправляется сервером. Таким образом, вы можете транслировать и воспроизводить видео с YouTube. Вот как вы можете это сделать:
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
Я скопировал код адеков, и это сработало для меня.... я думаю, вам нужно установить флеш-плательщика. и разрешил ли вам разрешение на интернет?
btw мой код здесь...
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);
}*/
}
файл макета
<?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>
Ответ 6
Почему вы хотите играть в трубку в веб-виде? Вы можете воспроизвести его, используя это намерение
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));
В противном случае, если вы хотите воспроизвести его в webView, перейдите по этой ссылке
http://www.stackoverflow.com/questions/9565533/android-how-to-play-youtube-video-in-webview?rq=1
Ответ 7
мой веб-просмотр был включен JavaScript, но удаление заставило видео работать
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Ответ 8
Попробуйте этот
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));