当应用程序进入后台时,无法在 Android 应用程序内 WebView 上暂停 HTML5/Flash 声音

Cannot pause HTML5 / Flash sound on Android in-app WebView when application going to background

重现问题的步骤:

  1. 使用应用内 WebView 启动应用程序。

  2. 调用webview.loadUrl("http://n-g.nxtomo.hk/CYvsCP/app.html?nocache=true");

  3. 点击网页一次,开始播放背景音乐。

  4. 按 HOME 键应用程序将进入后台,但音乐会继续播放。

预期当 activity 进入后台时 WebView 暂停。

我试过打电话:

webview.onResume();
webview.onPause();

Class.forName("android.webkit.WebView").getMethod("onResume", (Class[]) null).invoke(webview, (Object[]) null);
Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(webview, (Object[]) null);

wv.resumeTimers();
wv.pauseTimers();

对于 Android 4.4.2 和 5.0,这两种方式都不起作用(意味着没有效果并继续在后台播放声音),我只有两个设备。

我发现一个建议是删除强制停止播放声音的 MediaPlayer 回调。

@Override
    protected void onPause() {
        super.onPause();

        ((AudioManager) getSystemService(
                Context.AUDIO_SERVICE)).requestAudioFocus(
                null,
                AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
    }

停止声音的工作。 但!当我恢复应用程序时,声音不会连续自动播放。所以,我正在寻找一种正式的方法来解决这个问题。 :(

参考

  1. [问题 532359:当应用程序处于后台时,无法在 Android 应用程序内 WebView 上暂停 HTML5 声音。 - 2015 年 9 月 16 日] https://code.google.com/p/chromium/issues/detail?id=532359

  2. [问题 10282:PublicAPI 用于 WebView.onPause 和 WebView.onResume - 2010 年 8 月 7 日]https://code.google.com/p/android/issues/detail?id=10282

我遇到了完全相同的问题,正在寻找官方修复程序。 我发现的唯一解决方法是

loadUrl("");

但这远不是一个好的解决方案。一旦您多任务处理页面重新加载,如果您需要 webview 会话保持活动或持续,这可能会导致很多问题。

来自Google的回复: https://code.google.com/p/chromium/issues/detail?id=532359#c5

Hm, if you only want to change the Android app, you're probably out of luck with what you can do there.

If you can change the page, you may look into page visibility API to pause/resume playback (Tim may know if it's enabled for WebView or not).

But ultimately, since it's WebView, your app can communicate with the page and cause it to play/pause playback in the app's activity onPause/onResume.