最近在学习用pjsip开发网络电话,中间遇到了各种问题,现把解决方法记录下来。
- (void)setSpeaker:(BOOL)isOpen
{
UInt32 route;
OSStatus error;
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
route = isOpen ? kAudioSessionOverrideAudioRoute_Speaker : kAudioSessionOverrideAudioRoute_None;
error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);
}
AudioSessionSetProperty这个方法在iOS7以后已经废弃掉了,编译时会警告,但是仍然可以用。可能因为是个人习惯,不太喜欢项目通篇报黄色警告,所以写了一个iOS7以后可以用的方法,需要用到AVAudioSession这个类,需要引入AVFoundation.framework。其中AVaudioSessionPortOverrideNone是听筒播放语音流,AVaudioSessionPortOverrideSpeaker是扬声器播放。
-(void)receive:(BOOL)isSpeaker{
NSLog(@"+++++speaker:%@",isSpeaker?@"YES":@"NO");
if (!isSpeaker) {
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
}else{//speaker
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
}
}
另外我还实现了用红外线感应去控制听筒与扬声器的播放,代码如下:
#pragma mark --设置距离传感器
- (void)setproximity{
//添加近距离事件监听,添加前先设置为YES,如果设置完后还是NO的读话,说明当前设备没有近距离传感器
[[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
if ([UIDevice currentDevice].proximityMonitoringEnabled) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sensorStateChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];
}
}
//proximityState 属性 如果用户接近手机,此时属性值为YES,并且屏幕关闭(非休眠)。
-(void)sensorStateChange:(NSNotificationCenter *)notification{
if ([[UIDevice currentDevice] proximityState]) {
NSLog(@"Device is close to user");
//设置AVAudioSession 的播放模式
//[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
}else{
NSLog(@"Device is not close to user");
//[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
}
}
- (void)dealloc{
if ([UIDevice currentDevice].proximityMonitoringEnabled) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceProximityStateDidChangeNotification object:nil];
}
[[UIDevice currentDevice] setProximityMonitoringEnabled:NO];
}
把setproximity放在应用一加载完成的方法里,我是写在viewDidLoad中的。
另外网上有很多听筒与扬声器的切换方法,但是用在我这里都不起作用,不过我也记录下来,说不定以后可以用于其他场景。
-(void)speakerAction:(UIButton *)sender{
sender.selected = !sender.selected;
if (!sender.selected) {
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
}else{
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
}
}
参考链接:https://segmentfault.com/a/1190000007474125
http://www.cnblogs.com/lancely/p/5782748.html