我在应用程序启动时设置了一个AVAudioSession,并将委托设置为appDelegate。一切似乎都在工作(回放等),除了当电话收到呼叫时,代理上的beginInterruption没有被调用。当调用结束时,endInterruption将被调用。
我唯一的想法是,我使用的音频播放器代码过去是基于AVAudioPlayer的,但现在使用的是AVPlayer。用于处理中断的AVAudioPlayer委托的回调仍然存在,但它们会以任何方式发生冲突,这似乎很奇怪。
发布于 2012-09-15 05:53:01
看看iOS6中的头文件,看起来AVAudioSessionDelegate现在已经被弃用了。
在iOS6中改用AVAudioSessionInterruptionNotification。
更新:这并不管用。我认为框架中有一个bug。
是的,根据我的经验,beginInterruption和新记录的AVAudioSessionInterruptionNotification都不能正常工作。我必须做的是使用本地标志跟踪播放器的状态,然后处理endInterruption:withFlags:方法,以便跟踪从中断中恢复。
在iOS 6中,从中断中恢复至少会让你的AudioPlayer保持在正确的位置,所以我不需要存储我的AVAudioPlayer的最后已知播放时间,我只需点击play即可。
这是我想出的解决方案。如果AVPlayer停留时间太长,iOS 6似乎会通过媒体重置来关闭您的音频。最终发生的是,AVPlayer播放,但没有声音出来。AVPlayer的频率是1,但绝对没有声音。雪上加霜的是,AVAudioSession setActive和AVPlayer本身都没有错误,表明存在问题。
此外,你不能依赖appWillResignActive,因为如果你完全依赖远程控制手势,你的应用程序可能已经在后台了。
我实现的最后一个解决方案是在AVPlayer上添加一个定期观察者,并记录最后的已知时间。当我收到返回控制权的事件时,我创建一个新的AVPlayer,用AVPlayerItem加载它,并在适当的时间执行seekToTime。
这是一个相当恼人的变通方法,但至少它是有效的,并避免了周期性的崩溃。
发布于 2012-10-05 05:49:19
我可以确认,使用C api时,中断方法也不会在中断开始时调用;只有在中断结束时才会调用
(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));我也为这个问题向苹果提交了一份bug报告。
编辑:这是在iOS 6.1中修复的(但不是iOS 6.0.1)
发布于 2013-02-02 03:15:20
只需拨打:
[[AVAudioSession sharedInstance] setDelegate: self];https://stackoverflow.com/questions/11676836
复制相似问题