Загрузка видео с YouTube через iframe в веб-браузере Android
Я хочу загрузить видео с YouTube в веб-браузер Android с помощью iframe
вот мой макет Xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
android:id="@+id/mainLayout">
<WebView
android:background="@android:color/white"
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
Мой код:
public class WebTube extends Activity {
private WebView wv;
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/WBYnk3zR0os"
+ "?fs=0\" frameborder=\"0\">\n"
+ "</iframe>";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wv = (WebView)findViewById(R.id.webView);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadDataWithBaseURL("", html , "text/html", "UTF-8", "");
}
}
Также я предоставляю <uses-permission android:name="android.permission.INTERNET"/>
& Амп; android:hardwareAccelerated="true"
когда я запускаю это, я не получаю никакого результата, просто показывая черный экран
Я попробовал это. Но это предоставит мне видео на .3gp Quality
. но мне нужно видео с YouTube на оригинальном качестве. вот почему я использую iframe
.
Я пробую код, используя <object></object>
и <video></video>
вместо iframe
. но это не решило мою проблему.
когда я запускаю этот код на эмуляторе, он показывает
Перед нажатием кнопки воспроизведения
![iframe result on emulator]()
После нажатия кнопки воспроизведения на видео
![iframe result on emulator on play button click]()
Я думаю, что мы не можем передавать потоковое видео на эмуляторе, так как это виртуальное устройство
Но когда я запускаю это на телефоне, он даже не показывает этот результат.
Я пытаюсь использовать iframe с прикрепленным к нему документом, он отлично работает на телефоне и в эмуляторе
String customHtml = "<iframe src='http://docs.google.com/viewer?url=http://www.iasted.org/conferences/formatting/presentations-tips.ppt&embedded=true' width='100%' height='100%' style='border: none;'></iframe>";
Поэтому, пожалуйста, помогите мне загрузить видео в этот кадр.
(Я запускаю его по телефону). В чем проблема?
также будет ли iframe работать на Android 2.1?
кто-нибудь пробовал Youtube Api?
Ответы
Ответ 1
Как указано в документации Android для веб-поиска,
Поддержка HTML5 Видео
Чтобы поддерживать встроенное видео HTML5 в вашем приложении, вам нужно аппаратное ускорение включить, а установить WebChromeClient.
Для полноэкранной поддержки необходимы реализации onShowCustomView (View, WebChromeClient.CustomViewCallback) и onHideCustomView(), getVideoLoadingProgressView() является необязательным.
Ответ 2
У меня есть полностью настроенный ifram для просмотра youtube
public class Act_VideoPlayer extends Activity {
WebView webView;
ProgressBar progressBar;
ImageView back_btn;
String video_url = "KK9bwTlAvgo", html = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.full_screen_youtube_video_screen);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
back_btn = (ImageView) findViewById(R.id.full_videoview_btn);
back_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.loadData("", "text/html", "UTF-8");
finish();
}
});
webView = (WebView) findViewById(R.id.webView);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
if (video_url.equalsIgnoreCase("")) {
finish();
return;
}
WebSettings ws = webView.getSettings();
ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
ws.setPluginState(WebSettings.PluginState.ON);
ws.setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.reload();
if (networkUtil.isConnectingToInternet(Act_VideoPlayer.this)) {
html = getHTML(video_url);
} else {
html = "" + getResources().getString(R.string.The_internet_connection_appears_to_be_offline);
CustomToast.animRedTextMethod(Act_VideoPlayer.this, getResources().getString(R.string.The_internet_connection_appears_to_be_offline));
}
webView.loadData(html, "text/html", "UTF-8");
WebClientClass webViewClient = new WebClientClass(progressBar);
webView.setWebViewClient(webViewClient);
WebChromeClient webChromeClient = new WebChromeClient();
webView.setWebChromeClient(webChromeClient);
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
webView.loadData("", "text/html", "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
try {
webView.loadData("", "text/html", "UTF-8");
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
public class WebClientClass extends WebViewClient {
ProgressBar ProgressBar = null;
WebClientClass(ProgressBar progressBar) {
ProgressBar = progressBar;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
ProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
ProgressBar.setVisibility(View.GONE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogShowHide.LogShowHideMethod("webview-click :", "" + url.toString());
view.loadUrl(getHTML(video_url));
return true;
}
}
public String getHTML(String videoId) {
String html = "<iframe class=\"youtube-player\" " + "style=\"border: 0; width: 100%; height: 96%;"
+ "padding:0px; margin:0px\" " + "id=\"ytplayer\" type=\"text/html\" "
+ "src=\"http://www.youtube.com/embed/" + videoId
+ "?&theme=dark&autohide=2&modestbranding=1&showinfo=0&autoplay=1\fs=0\" frameborder=\"0\" "
+ "allowfullscreen autobuffer " + "controls onclick=\"this.play()\">\n" + "</iframe>\n";
LogShowHide.LogShowHideMethod("video-id from html url= ", "" + html);
return html;
}
}
Ответ 3
Это сработало для меня:
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
String frameVideo = "<html><body>Youtube video .. <br> <iframe width=\"320\" height=\"315\" src=\"https://www.youtube.com/\" frameborder=\"0\" allowfullscreen></iframe></body></html>";
mWebView.loadData(frameVideo, "text/html", "utf-8");
mWebView.loadUrl("http://www.youtube.com/");
mWebView.setWebViewClient(new WebViewClient());
Ответ 4
Попробуйте сделать это хорошо.
mWebView = (WebView) findViewById(R.id.web);
String videoURL = "https://www.youtube.com/embed/R52bof3tvZs";
String vid = "<html><body style=\"margin: 0; padding: 0\"><iframe width=\"100%\" height=\"100%\" src=\""+videoURL+"\" type=\"text/html\" frameborder=\"0\"></iframe><body><html>";
WebChromeClient mWebChromeClient = new WebChromeClient(){
public void onProgressChanged(WebView view, int newProgress) {
}
};
mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl("javascript:(function() { document.getElementsByTagName('video')[0].play(); })()");
}
});
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.setInitialScale(1);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
if (Build.VERSION.SDK_INT < 17) {
Log.i("GPSNETWORK", "<17");
} else {
Log.i("GPSNETWORK", Build.VERSION.SDK_INT+">=17");
mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
}
String myUrl = "<html><body style='margin:0px;padding:0px;'>\n" +
" <script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>\n" +
" var player;\n" +
" function onYouTubeIframeAPIReady()\n" +
" {player=new YT.Player('playerId',{events:{onReady:onPlayerReady}})}\n" +
" function onPlayerReady(event){player.mute();player.setVolume(0);player.playVideo();}\n" +
" </script>\n" +
" <iframe id='playerId' type='text/html' width='1280' height='720'\n" +
" src=\""+videoURL+"\"?enablejsapi=1&rel=0&playsinline=1&autoplay=1&showinfo=0&autohide=1&controls=0&modestbranding=1' frameborder='0'>\n" +
" </body></html>";
mWebView.loadData(""+Html.fromHtml(myUrl), "text/html", "UTF-8");
Ответ 5
Я не эксперт в веб-браузере Android, но столкнулся с аналогичными проблемами с веб-страницей.
Мне нужно было использовать тег и убедиться, что он имеет onclick = "this.play(); в теге. Событие onclick было специально для Android. Chrome, Safari, Firefox не нуждались в нем.
Например:
<video id="video" width="320" height="240" autobuffer controls onclick="this.play();">
Без onclick браузер Android не работает. Поскольку веб-браузер вызывает браузер, я подозреваю, что он тот же.
И убедитесь, что в теге источника вы НЕ используете атрибут кодека.
Надеюсь, это поможет вам.
Ответ 6
Это не совсем прямой ответ на ваш вопрос, но я считаю, что вы можете использовать недавно выпущенный API Youtube для Android. Это должно позволить добавлять воспроизведение видео в YouTube, поэтому вам не нужно вводить их в веб-просмотр в iFrame. Это просто глупо, и не все Android-устройства будут установлены Flash:)
https://developers.google.com/youtube/android/player/
Ответ 7
Вы снова можете посетить мой question. Iv'e создал функцию, которая дает вам все прямые ссылки на видео YouTube (включая ссылки hq). Теперь вы можете использовать mp4 и так вместо бедных 3gp.
Ответ 8
Использование WebChromeClient позволяет обрабатывать диалоги, значки, заголовки и прогресс Javascript:
wv = setWebChromeClient(new WebChromeClient());
Ответ 9
Это работает правильно
Мой файл Java
String path="<iframe src='https://www.youtube.com/embed/eWEF1Zrmdow' width='100%' height='100%' style='border: none;'></iframe>";
webView.loadData(path,"text/html","utf-8");
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());