1.现象描述
AVAudioSessionCategoryPlayback,当有异常时发出相应的警报声,此时手机如果有来电进入,此时app仍然有报警声,同时伴随电话铃声。
2.解决方案
继续查找资料,最终找到CoreTelephony框架,这个框架包含了电话相关的API,可以实现监测来电,查看运营商信息等功能。下面就是具体的实现监测来电的代码
倒入框架:
@import
声明变量:
@property (nonatomic,strong) CTCallCenter *center;
在viewDidLoad中实现相关功能:
center = [[CTCallCenter alloc] init];
__weak typeof(self) weakSelf = self;
center.callEventHandler = ^(CTCall * call) {
if ([call.callState isEqualToString:CTCallStateIncoming])
{
电话振铃过程中的事件处理
audioPlayer pause];//电话进来时暂停播放器
CommonFunction setisPlayVioce:NO];
NSLog(@"CTCallStateIncoming");
}else if ([call.callState isEqualToString:CTCallStateDisconnected])
{
//电话挂断后的事件处理
NSLog(@"CTCallStateDisconnected");
audioPlayer play];//电话结束时恢复警告播放
CommonFunction setisPlayVioce:YES];
}else if ([call.callState isEqualToString:CTCallStateDialing])
{
//打电话出去的状态(回铃音)事件处理
NSLog(@"CTCallStateDialing");
}else if ([call.callState isEqualToString:CTCallStateConnected])
{
//电话接通状态事件处理
NSLog(@"CTCallStateConnected");
}
};
3.相关音频模式梳理
AVAudioSessionCategory相关
AVAudioSessionCategoryAmbient
使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音,所以开启应用打断音乐程序播放音乐应该使用这个Category。
AVAudioSessionCategorySoloAmbient
类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音
AVAudioSessionCategoryPlayback
使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音
AVAudioSessionCategoryRecord
用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。
AVAudioSessionCategoryPlayAndRecord
用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。
AVAudioSessionCategoryOptions中的AVAudioSessionCategoryOptionMixWithOthers
设置这个选项在激活会话时不会打断其他应用程序的音频播放,在以下的选项中可用AVAudioSessionCategoryPlayback 、 AVAudioSessionCategoryPlayAndRecord 、 AVAudioSessionCategoryMultiRoute(ios6加入的多线路)
AVAudioSessionCategoryOptionDuckOthers
这个选项在激活会话时降低其他程序的音频播放声音,在以下的选项中可用AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord
主要是体现当前音频的重要性,比如说开车听歌的时候,导航的声音就属于比较重要的或者是需要特别关注的就可以是用这个选项
AVAudioSessionCategoryOptionAllowBluetooth
允许可免提蓝牙设备可使用输入通道
AVAudioSessionCategoryOptionDefaultToSpeaker
设置这个选项在没有其他通道的时候默认选择内置扬声器
AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWIthOthers(iOS9.0加入的)
当你的app偶尔的使用音频播放(感觉和DuckOthers很像,文档中提到这两个是可以互换的)在以下的选项中可用AVAudioSessionCategoryPlayback 、 AVAudioSessionCategoryPlayAndRecord 、 AVAudioSessionCategoryMultiRoute
如果设置了这个选项,在关闭这个session时需要:
[myAudioSession setActive: NO with Options: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error: <#Your error object, or nil for testing#>];
这句代码是为了确保执行当前session之前被打断的正在播放的 audio app能都收到resume消息。