我的情况是我们有一个使用webview的Android应用程序。当用户导航到YouTube视频时,它会开始播放(带有音频),然后用户使用设备的硬件开关锁定设备,它会继续播放音频。
当使用设备菜单将应用程序发送到后台或退出应用程序时,不会发生这种情况。
有谁知道为什么会发生这种情况以及如何阻止它?
编辑:我刚刚在这里发现了类似的,未得到答复的帖子:App enables background playing of videos, cordova issues, google play rejecting apps答案 0 :(得分:6)
Google在拒绝该应用时遇到了同样的问题,因为当您按下电源按钮关闭屏幕时,webview会继续播放来自YouTube视频的音频。
出于某种原因,似乎按下电源按钮不会触发webview的onPause(),这就是音频继续播放的原因。虽然这对于在屏幕关闭时保持音乐播放很有用,但Google不喜欢youtube视频的这种行为。
为了让Google满意,您可以覆盖活动/片段的onPause(),如下所示:
@Override
public void onPause() {
super.onPause();
myCustomWebView.onPause();
}
按下电源按钮现在也会触发webview的onPause()。然而,这会产生另一个问题:在屏幕关闭时你真正想要继续播放的音频怎么样?
我提出的一个修复是覆盖WebViewClient的onLoadResource(),它允许我检查资源是否来自youtube,这决定了当时间到来时是否应该调用webview的onPause()。像这样:
myCustomWebView.setWebViewClient(new WebViewClient() {
@Override
public void onLoadResource(WebView webview, String url) {
super.onLoadResource(webview, url);
if (url.contains("youtube.com")) mShouldPause = true;
}
//...... plus any other method you want to override
});
当然,这确实意味着任何在其url中包含“youtube.com”的资源都会触发该标志,但是对于我的需要,这就足够了。所以onPause()方法现在看起来像这样:
@Override
public void onPause() {
super.onPause();
// mShouldPause is just a private boolean
if (mShouldPause) {
myCustomWebView.onPause();
}
mShouldPause = false;
}
因此,这是我提出的解决方案,而不会使用反射来处理webview的内部工作。您可能想要创建一个通知,其中包含一个停止音频的按钮或将用户带回您的应用程序,这样用户就不会忘记哪个应用程序发出声音并认为手机闹鬼!!!