——周技术回顾
前言
最近在做一个需求,需要监听耳机是否拔出设备,我们知道耳机有蓝牙耳机和有线耳机,在做的时候遇到个坑,portType有很多种,直接监听普通耳机和蓝牙的type发现苹果转接的耳机监听不到,因为苹果转接的属于另一个type。
AVAudioSessionPortHeadphones 普通耳机
AVAudioSessionPortBluetoothA2DP 蓝牙设备
AVAudioSessionPortUSBAudio 串行总线设备(通过转接口耳机需要监听这个type)
- 判断当前是否插入耳机
- (BOOL)isHeadSetPlugging {AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];for (AVAudioSessionPortDescription* desc in [route outputs]) {if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortUSBAudio])return YES;}return NO;
}
- 监听耳机是一个系统实现的单例方法,通过发送通知来告诉耳机的状态,AVAudioSessionRouteChangeNotification 路线改变通知(如扬声器切换为耳机.也就是耳机插入设备)
[[[NSNotificationCenter defaultCenter] rac_addObserverForName_mgs:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]] subscribeNext:^(NSNotification * _Nullable x) {NSDictionary *dic = x.userInfo;NSInteger routeChangeReason = [[dicvalueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];switch (routeChangeReason) {case AVAudioSessionRouteChangeReasonNewDeviceAvailable://耳机插入break;case AVAudioSessionRouteChangeReasonOldDeviceUnavailable://耳机拔出break;case AVAudioSessionRouteChangeReasonCategoryChange://类别改变 break;}}];
总结
做一个功能的时候需要考虑的更加仔细,各种场景都能考虑到,尽可能让功能更稳定,代码质量更高,做耳机监听的时候,一开始没有考虑到苹果转接耳机的场景,从而会有点问题,好在及时得到解决,也对耳机监听的技术有了更加深入了解。