VOIP听筒与扬声器的切换

最近在学习用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

你可能感兴趣的:(pjsip)