AVAudioSession正在播放系统声音

时间:2015-09-30 19:32:21

标签: ios swift avaudioplayer

嘿所以我在下面有这个代码。我只是试图得到它,以便如果他们是任何音乐,播客等正在播放操作系统内的另一个应用程序,所有声音都是静音。但是我尝试设置它的类别,它不会起作用!我没有使用正确的类别吗?也许不是在正确的地方?

目标是用户可以在使用应用程序时收听自己的音乐。

sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("GameMusic9", ofType: "mp3")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("GameMusicRP", ofType: "mp3")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Death", ofType: "mp3")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Tap", ofType: "wav")!)!)

        //Monsters
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Blue", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Brown", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Green", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Orange", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Purple", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Red", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Tan", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Yellow", ofType: "wav")!)!)
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Correct", ofType: "wav")!)!)//12
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Cowbell", ofType: "aiff")!)!)//13
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("12", ofType: "wav")!)!)//14
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Hybrid", ofType: "mp3")!)!)//15
        sounds.append(NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Correct", ofType: "wav")!)!)//16

        AVAudioSession.sharedInstance().setActive(true, error: nil)

        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil)

        //Close or punch, or bycycle

        var error:NSError?
        for var i:Int = 0; i < sounds.count; i++
        {
            audioPlayers.append(AVAudioPlayer(contentsOfURL: sounds[i], error: &error))

            audioPlayers.last?.prepareToPlay()
        }

1 个答案:

答案 0 :(得分:2)

不,你没有使用正确的类别。来自docs

  

AVAudioSessionCategoryAmbient

     

声音应用的类别   播放是非主要的 - 也就是说,您的应用可以成功使用   声音关闭了。

     

此类别也适用于“播放”风格的应用,例如   用户在播放音乐应用时播放的虚拟钢琴。什么时候   您使用此类别,来自其他应用的音频与您的音频混合。   通过屏幕锁定和静音开关使您的音频静音   (在iPhone上称为Ring / Silent开关)。

尝试AVAudioSessionCategoryPlayback

  

AVAudioSessionCategoryPlayback

     

播放录制音乐或其他声音的类别   成功使用您的应用程序的核心。

     

使用此类别时,您的应用音频将继续使用“静音”   开关设置为静音或屏幕锁定时。 (称为开关   iPhone上的响铃/静音开关。)继续播放音频   app转换为背景(例如,当屏幕   锁),将音频值添加到你的UIBackgroundModes键   信息属性列表文件。

     

默认情况下,使用此类别的表示您应用的音频是   不可混合激活会话将中断任何其他音频   会话也是不可混合的。要允许混合此类别,   使用AVAudioSessionCategoryOptionMixWithOthers选项。

或者尝试使用AVAudioSessionCategorySoloAmbient AVAudioSessionCategoryAmbient,但默认情况下不可混合。

编辑:我误解了这个问题。目标是只在其他应用程序没有播放任何内容时播放音乐。这可以通过检查共享的AVAudioSession

来实现
[[AVAudioSession sharedInstance] isOtherAudioPlaying];

如果它返回NO,则只播放您的音乐。请注意,从iOS 8.0开始,最好使用另一个属性(它们的语义略有不同):

[[AVAudioSession sharedInstance] secondaryAudioShouldBeSilencedHint];
  

当另一个具有不可混合音频的应用程序时,该值为YES   会话播放音频。

     

应用程序应该使用此属性作为静音音频的提示   是次要的应用程序的功能。例如,a   使用AVAudioSessionCategoryAmbient的游戏可以使用此属性   决定将其音轨静音,同时保持其静音效果。

您还应订阅AVAudioSessionSilenceSecondaryAudioHintNotification次通知并停止/启动音乐以反映secondaryAudioShouldBeSilencedHint中的更改。

NSNotificationCenter.defaultCenter().addObserverForName(AVAudioSessionSilenceSecondaryAudioHintNotification, object: nil, queue: nil) { notification in
// stat/stop music based on AVAudioSession.sharedInstance().secondaryAudioShouldBeSilencedHint
}