如何停止在我的网页浏览中播放的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");
答案 0 :(得分:88)
请参阅以下有关WebView threads never stopping
的帖子基本上你需要从你自己的Activity的onPause方法调用WebView的onPause方法。
唯一的技巧是你无法直接调用WebView的onPause方法,因为它是隐藏的。因此,您需要通过反射间接调用它。以下代码可以帮助您开始设置自己的Activity的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) {
...
}
}
请注意,上面try块中的变量“webview”是类的私有实例变量,并在Activity的onCreate方法中赋值。
答案 1 :(得分:67)
解决方案:1 -
花了很多时间之后,我得出了暂停视频的结论,该视频正在使用HTML的WebView <iframe>
概念。
只需在您使用onPause()
时覆盖Activity或Fragment上的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");
答案 2 :(得分:17)
你还必须实现onResume()方法或第二次它不会工作
@Override
public void onResume()
{
super.onResume();
webView.onResume();
}
@Override
public void onPause()
{
super.onPause();
webView.onPause();
}
答案 3 :(得分:15)
上述解决方案在使用Android 2.3.3的三星Galaxy S上失败了。 但是我尝试了下面的解决方法取得了成功:
webview.loadUrl("file:///android_asset/nonexistent.html");
我正在强制webview加载一个不存在的html文件。这似乎迫使webview清理了一切。
答案 4 :(得分:5)
试试这个:
// HTML
this is a funky pointer -{ldelim}
// Code Gererated
this is a funky pointer -{
// HTML
This next is php {php} echo 'hello'; {/php}
// Code Gererated
This next is php <?php echo 'hello'; ?>
// HTML
I can count to 5: {for $i = 1; $i <= 5; $i++} {$i} {/for}
// Output Gererated
I can count to 5: 12345
// HTML
My numbers are {foreach from=$aVar item=iItem} {$iItem},
// Output Gererated
My numbers are 1,2,3,4,
// HTML
Show the ajax loading image {img theme='ajax/small.gif'}
// HTML Example Show an image uploaded by a user
{img server_id=$aPhoto.server_id path='photo.url_photo' file=$aPhoto.destination suffix='_150' max_width=150 max_height=150 class="hover_action" title=$aPhoto.title}
答案 5 :(得分:4)
这是我个人的最爱:
@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();
}
如果视图仅暂停,它会暂停webview,但在活动结束时会将其清除。
至少需要Android 3.0 - API 11(Honeycomb)
答案 6 :(得分:4)
@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);
}
它有效
答案 7 :(得分:3)
在遇到这个问题后,似乎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();
}
希望它可以帮助任何与我有同样问题的人
答案 8 :(得分:3)
Webview.loadUrl( “关于:空白”);
它也在工作
答案 9 :(得分:1)
This适合我。
@Override
protected void onPause() {
super.onPause();
if (wViewCampaign != null){
wViewCampaign.stopLoading();
wViewCampaign.loadUrl("");
wViewCampaign.reload();
wViewCampaign = null;
}
}
答案 10 :(得分:1)
你可以试试这个
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");
}
答案 11 :(得分:0)
执行onPause()
的方法onPause()
时,可以使用WebView的方法Activity
来执行此操作:
@override
public void onPause() {
super.onPause();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
webview.onPause();
}
}
API >= 11
(Honeycomb
)答案 12 :(得分:0)
这是在尝试本页面提供的每个代码后最终工作的内容。 UFF!
@Override
protected void onPause() {
super.onPause();
if (mWebView != null) {
mWebView.stopLoading();
mWebView.reload();
}
}
@Override
protected void onResume() {
super.onResume();
}
答案 13 :(得分:0)
上述方法对我不起作用,对我有用的是:
@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);
}
答案 14 :(得分:0)
我尝试了以上所有答案,但大多数都不适合我。所以我只写自己的解决方案,就可以在Webview中播放的所有类型的媒体上正常工作
String lastUrl = "";
@Override
public void onPause() {
super.onPause();
lastUrl = webView.getUrl();
webView.loadUrl("");
}
@Override
protected void onResume() {
super.onResume();
webView.loadUrl(lastUrl);
}
@Override
protected void onDestroy() {
super.onDestroy();
webView = null;
}
答案 15 :(得分:0)
在我的情况下,播放器在WebView为“ onPause”后继续运行。 因此,在播放视频或音乐之前,我先检查WebView是否已连接到Windows。
这是用于检查WebView的“ isAttachedToWindow()”返回true / false的JavaScriptInterface方法。
(而且我也没有忘记在Activity / Fragment中调用onPause / onResume。)
答案 16 :(得分:0)
基于@sommesh的答案:
override fun onPause() {
super.onPause()
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
if (Utils.hasOreoSDK26()) {
val audioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
val audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
.setAudioAttributes(audioAttributes)
.setAcceptsDelayedFocusGain(true)
.setWillPauseWhenDucked(true)
.setOnAudioFocusChangeListener(
{ focusChange -> Timber.i(">>> Focus change to : %d", focusChange) },
Handler())
.build()
audioManager.requestAudioFocus(audioFocusRequest)
} else {
audioManager.requestAudioFocus({ }, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
}
}
答案 17 :(得分:-1)
这段代码非常适合我。
@Override protected void onPause() {
super.onPause();
wv.onPause();
wv.pauseTimers();
}
@Override protected void onResume() {
super.onResume();
wv.resumeTimers();
wv.onResume();
}