当前位置: 首页 > 知识库问答 >
问题:

当进程处于后台时,如何在Android Chrome中禁用音频播放?

周瀚
2023-03-14

如何以编程方式禁止在Chrome Android进程的后台播放歌曲?

这是一个简单的页面示例,它在Chrome中播放歌曲:

https://thomashunter.name/examples/chrome-audio-bug.html

var song = new Audio('song.ogg');
song.loop = 'loop';

button = document.getElementById('play');

button.addEventListener("click", function() {
  song.play();
});

注意这首歌是如何在背景中继续播放的。虽然对于点唱机来说很好,但它会让网络游戏的玩家发疯。

有没有办法禁用Chrome中单个音频元素的后台播放?或者,当页面失去焦点时,是否至少有一个回调,以便我可以运行歌曲。停止()?

共有2个答案

上官砚文
2023-03-14

使用HTML5可视性API

    <script>
    var song = new Audio('http://zyu.me:1337/audio/Evasion.ogg');
    song.loop = 'loop';

    button = document.getElementById('play');

    button.addEventListener("click", function() {
      song.play();
    });
var vis = (function(){
    var stateKey, 
        eventKey, 
        keys = {
                hidden: "visibilitychange",
                webkitHidden: "webkitvisibilitychange",
                mozHidden: "mozvisibilitychange",
                msHidden: "msvisibilitychange"
    };
    for (stateKey in keys) {
        if (stateKey in document) {
            eventKey = keys[stateKey];
            break;
        }
    }
    return function(c) {
        if (c) document.addEventListener(eventKey, c);
        return !document[stateKey];
    }
})();
  
  vis(function(){
					
    if(vis()){
        console.log("tab is visible");
		song.play();									
    } else {
	
        console.log("tab is invisible");	
		song.pause();
    }
});
  
  
  </script>
郭胤
2023-03-14

您可以尝试使用visibilitychange:

document.addEventListener('visibilitychange', function(){
    if (document.hidden) {
        // Document is hidden 

        // This re-initialize the audio element
        // to release the audio focus
        song.load(); 
    }
    else {
        // Document is focused
    }
},false);

完整的示例可在此处获得https://jsfiddle.net/6001wsf9/

在Android 5.0和Chrome 43.0.2357.78上测试

 类似资料:
  • 问题内容: 我正在制作音频播放器。它具有暂停,倒带和时间搜索功能。如何以及由谁处理音频元素? 我可以把它放在商店旁边。我不能将其直接放在状态上,因为它可能会被克隆。然后,在减速器中,我可以与其进行交互。问题是,如果我需要将时间滑块与音频同步,则需要使用动作不断地轮询商店。从语义上讲,这也没有任何意义。 我可以创建一个自定义的React组件Audio,它可以完成我所说的一切。问题没有解决。如何刷新滑

  • 问题内容: 我正在制作一个Java应用程序,我需要播放音频。尽管我计划循环播放背景音乐,但我主要播放的是我的大炮射击(它是大炮射击游戏)和弹丸爆炸的小声音文件。我找到了两种不同的方法来实现此目的,但是两种方法都不符合我的要求。 第一种方法实际上是一种方法: 问题是我的整个程序停止运行,直到声音文件完成或至少接近完成。 第二种方法是这样的: 我这里的问题是,每次声音文件提早结束或根本不播放时,这取决

  • 如何后台播放音乐

  • 播放视频,当应用程序转到后台时,它应继续播放音频,当我重新打开时,它应恢复有关我们在音频中的位置的视频。 我在一个服务中使用exoplayer,我可以在后台播放音频,但当我对视频执行相同操作时,音频正在播放,但当我回到应用程序时,视频只是一个黑屏,如果我再次重复(转到后台并回到应用程序)该步骤,它将继续播放视频。 据我所知,exoplayer正在缓冲下一帧,播放器视图无法一次渲染所有帧。 我有一个

  • 我正在使用FCM在代码下推送通知,以便在收到通知时播放声音 我称之为OnMessageReceived方法,但声音仅在应用程序位于前台时播放,而不是在应用程序位于后台时播放