UIWebView中的Web Audio API会停止音乐应用的当前歌曲

时间:2015-02-18 20:30:22

标签: javascript ios uiwebview web-audio

Web Audio API的简单用法:

var UnprefixedAudioContext = window.AudioContext || window.webkitAudioContext;

var context;
var volumeNode;
var soundBuffer;

context = new UnprefixedAudioContext();
volumeNode = context.createGain();
volumeNode.connect(context.destination);
volumeNode.gain.value = 1;

context.decodeAudioData(base64ToArrayBuffer(getTapWarm()), function (decodedAudioData) {
    soundBuffer = decodedAudioData;
});

function play(buffer) {
    var source = context.createBufferSource();
    source.buffer = buffer;
    source.connect(volumeNode);
    (source.start || source.noteOn).call(source, 0);
};

function playClick() {
    play(soundBuffer);
}
UIWebView内的

工作正常(播放声音);但是当你切换到音乐应用程序并播放一首歌曲,然后使用UIWebView回到应用程序时,歌曲就会停止播放。

Safari中的相同代码没有此问题。

是否有解决方法可以避免此行为?

这是完整的小提琴:

http://jsfiddle.net/gabrielmaldi/4Lvdyhpx/

1 个答案:

答案 0 :(得分:1)

你在iOS上吗?这听起来像是一个音频会话类别问题。 iOS应用程序定义其音频与音频的交互方式。来自Apple's documentation

  

每个音频会话类别指定“是”的特定模式   如下表所示,以下每种行为均为“否”   B-1:

     

中断不可混合的应用音频:如果是,那么非混音应用将是   当您的应用激活其音频会话时中断。

     

静音开关静音:如果是,您的音频会在静音时静音   用户将静音开关移动到静音。 (在iPhone上,这个开关是   称为Ring / Silent开关。)

     

支持音频输入:如果是,则允许应用音频输入(录制)。

     

支持音频输出:如果是,则应用音频输出(播放)   允许的。

默认类别默认来自其他应用的音频:

  

AVAudioSessionCategorySoloAmbient-(默认)仅播放。沉默   当用户将振铃/静音开关切换到“静音”时音频   位置和屏幕锁定时。这个类别不同于   AVAudioSessionCategoryAmbient类别只是因为它中断了   其他音频。

这里的关键在于最后一句:"它会中断其他音频"。

您可以使用许多其他类别,具体取决于您是否希望在屏幕锁定时音频静音等。AVAudioSessionCategoryAmbient不会使音频静音。

尝试在应用的Objective-c部分尝试:

NSError *setCategoryError = nil;

BOOL success = [[AVAudioSession sharedInstance]
                setCategory: AVAudioSessionCategoryAmbient
                      error: &setCategoryError];

if (!success) { /* handle the error in setCategoryError */ }