VOIP 수화기 및 스피커 전환
3347 단어 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);
}
Audio Session SetProperty 이 방법은 iOS7 이후 폐기되었습니다. 컴파일할 때 경고하지만 사용할 수 있습니다.개인적인 습관이라 그런지 프로젝트 통편지의 노란색 경고를 별로 좋아하지 않아서 iOS7 이후에 사용할 수 있는 방법을 썼습니다. AVAudioSession 같은 종류를 사용해야 하고 AVFoundation을 도입해야 합니다.framework.그 중에서 AVaudio Session Port Override None은 수화기로 음성 흐름을 재생하고, AVaudio Session Port Override Speaker는 스피커로 재생한다.
-(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