设备锁定后停止播放Android应用音频

时间:2016-05-09 04:15:20

标签: android cordova audio background

我的情况是我们有一个使用webview的Android应用程序。当用户导航到YouTube视频时,它会开始播放(带有音频),然后用户使用设备的硬件开关锁定设备,它会继续播放音频。

当使用设备菜单将应用程序发送到后台或退出应用程序时,不会发生这种情况。

有谁知道为什么会发生这种情况以及如何阻止它?

编辑:我刚刚在这里发现了类似的,未得到答复的帖子:App enables background playing of videos, cordova issues, google play rejecting apps

1 个答案:

答案 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的内部工作。您可能想要创建一个通知,其中包含一个停止音频的按钮或将用户带回您的应用程序,这样用户就不会忘记哪个应用程序发出声音并认为手机闹鬼!!!