Как остановить воспроизведение видео youtube в Android webview?
Как я могу остановить видео YouTube, которое воспроизводится в моем веб-представлении? Когда я нажимаю на кнопку Назад, видео не останавливается и переходит в фоновом режиме.
код:
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setPluginsEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(false);
webView.getSettings().setSupportZoom(false);
webView.loadData(myUrl,"text/html", "utf-8");
15 ответов:
смотрите следующий пост о потоки WebView никогда не останавливаются
по существу, вам нужно будет вызвать метод onPause WebView из метода onPause вашего собственного действия.
единственный трюк с этим заключается в том, что вы не можете вызвать метод onPause WebView напрямую, потому что он скрыт. Поэтому вам нужно будет вызвать его косвенно через отражение. Следующий код должен помочь вам начать настройку onPause вашего собственного действия метод:
@Override public void onPause() { super.onPause(); try { Class.forName("android.webkit.WebView") .getMethod("onPause", (Class[]) null) .invoke(webview, (Object[]) null); } catch(ClassNotFoundException cnfe) { ... } catch(NoSuchMethodException nsme) { ... } catch(InvocationTargetException ite) { ... } catch (IllegalAccessException iae) { ... } }
обратите внимание, что переменная 'webview' в блоке try выше является частной переменной экземпляра для класса и назначается в методе onCreate действия.
Решение: 1 - Проведя много времени, я пришел к выводу пауза видео который играет с WebView
<iframe>
концепция HTML.просто переопределить
onPause()
метод на активность или фрагмент, где бы вы ни использовалиWebView
, и назвать его. Это работает на меня.@Override public void onPause() { super.onPause(); mWebView.onPause(); } @Override public void onResume() { super.onResume(); mWebView.onResume(); }
решение: 2 - Если выше решение не работает для вас, то вы можете заставить WebView загрузить несуществующий html-файл.
mWebview.loadUrl("file:///android_asset/nonexistent.html");
вы также должны реализовать метод onResume () или во второй раз он не будет работать
@Override public void onResume() { super.onResume(); webView.onResume(); } @Override public void onPause() { super.onPause(); webView.onPause(); }
вышеуказанное решение не удалось для меня на Samsung Galaxy S с Android 2.3.3. Но я сделал успех, пытаясь ниже обходной путь:
webview.loadUrl("file:///android_asset/nonexistent.html");
Я заставляю webview загружать несуществующий html-файл. Это, кажется, заставляет webview очищать вещи.
попробуйте это:
@Override public void onPause() { super.onPause(); myWebView.onPause(); myWebView.pauseTimers(); } @Override public void onResume() { super.onResume(); myWebView.resumeTimers(); myWebView.onResume(); } @Override protected void onDestroy() { myWebView.destroy(); myWebView = null; super.onDestroy(); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode==event.KEYCODE_BACK) { mWebview.loadUrl(""); mWebview.stopLoading(); finish(); } return super.onKeyDown(keyCode, event); }
он работает
и вот мой личный фаворит:
@Override protected void onPause() { super.onPause(); if (isFinishing()) { webView.loadUrl("about:blank"); } else { webView.onPause(); webView.pauseTimers(); } } @Override protected void onResume() { super.onResume(); webView.resumeTimers(); webView.onResume(); }
он приостанавливает веб-представление, если представление только приостановлено, но очищает его, когда действие завершено.
для этого требуется как минимум Android 3.0-API 11 (Honeycomb)
после того, как столкнулся с этой проблемой, кажется, что onPause может ничего не делать... для меня это не останавливало то, что играло в фоновом режиме.
Так что мой код теперь выглядит так:
@Override protected void onPause() { mWebView.onPause(); super.onPause(); } @Override protected void onResume() { mWebView.onResume(); super.onResume(); } @Override protected void onSaveInstanceState(Bundle outState) { mWebView.saveState(outState); super.onSaveInstanceState(outState); } @Override protected void onDestroy() { mWebView.destroy(); mWebView = null; super.onDestroy(); }
надеюсь, что это поможет любому с той же проблемой, что и я
этой работает для меня.
@Override protected void onPause() { super.onPause(); if (wViewCampaign != null){ wViewCampaign.stopLoading(); wViewCampaign.loadUrl(""); wViewCampaign.reload(); wViewCampaign = null; } }
вы можете попробовать этот
webView.loadUrl("javascript:document.location=document.location");
если страница, которая загружается, Вы можете редактировать, то вы можете написать метод javascript, который останавливает звук и вызывает, когда вы хотите остановиться.
функция Javascript
function stopAudio(){ audios=document.querySelectorAll('audio'); for(i=0;i<audios.length;i++){ audios[i].stop(); } }
из Andorid вызовите этот метод
webView.loadUrl("javascript:stopAudio()");
если страница не редактируется вами, вы можете ввести код js
@Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); injectScriptFile(view, "js/script.js"); }
вы можете сделать это с помощью метода
onPause()
из WebView, когда выполняется методonPause()
вашегоActivity
:@override public void onPause() { super.onPause(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ webview.onPause(); } }
- работает
API >= 11
(Honeycomb
)
это то, что, наконец, сработало после попытки каждого кода, представленного на этой странице. Уфф!
@Override protected void onPause() { super.onPause(); if (mWebView != null) { mWebView.stopLoading(); mWebView.reload(); } } @Override protected void onResume() { super.onResume(); }
приведенный выше подход не работал для меня, тот, который работал для меня:
@Override protected void onPause() { super.onPause(); ((AudioManager)getSystemService( Context.AUDIO_SERVICE)).requestAudioFocus( new OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) {} }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); }