设备锁定时停止播放Android应用程序音频

Guy*_*owe 4 audio android background cordova

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

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

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

编辑:我刚刚在这里发现了类似的,未答复的帖子:应用程序可以播放视频,科尔多瓦问题,谷歌播放拒绝应用程序

小智 6

Google在拒绝该应用时遇到了同样的问题,因为当您按下电源按钮关闭屏幕时,webview会继续播放来自YouTube视频的音频.

出于某种原因,似乎按下电源按钮不会触发webview的onPause(),这就是音频继续播放的原因.虽然这对于在屏幕关闭时保持音乐播放很有用,但Google不喜欢youtube视频的这种行为.

为了让Google满意,您可以覆盖活动/片段的onPause(),如下所示:

@Override
public void onPause() {
    super.onPause();
    myCustomWebView.onPause();
}
Run Code Online (Sandbox Code Playgroud)

按下电源按钮现在也会触发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

});
Run Code Online (Sandbox Code Playgroud)

当然,这确实意味着任何在其url中包含"youtube.com"的资源都会触发该标志,但是对于我的需要,这就足够了.所以onPause()方法现在看起来像这样:

@Override
public void onPause() {
    super.onPause();
    // mShouldPause is just a private boolean
    if (mShouldPause) {
        myCustomWebView.onPause();
    }
    mShouldPause = false;
}
Run Code Online (Sandbox Code Playgroud)

因此,这是我提出的解决方案,而不会使用反射来处理webview的内部工作.您可能想要创建一个通知,其中包含一个按钮来停止音频或将用户带回您的应用程序,这样用户就不会忘记哪个应用程序发出声音并认为手机闹鬼!