——周技术回顾

前言

最近在做一个需求,需要监听耳机是否拔出设备,我们知道耳机有蓝牙耳机和有线耳机,在做的时候遇到个坑,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;}}];

总结

做一个功能的时候需要考虑的更加仔细,各种场景都能考虑到,尽可能让功能更稳定,代码质量更高,做耳机监听的时候,一开始没有考虑到苹果转接耳机的场景,从而会有点问题,好在及时得到解决,也对耳机监听的技术有了更加深入了解。

【iOS】监听耳机状态相关推荐

  1. iOS 监听耳机状态

    // iOS 7 的代码 - (BOOL)hasHeadset { #if TARGET_IPHONE_SIMULATORreturn NO; #elseCFStringRef route;UInt3 ...

  2. 分享一套超棒的iOS “空状态” (empty state) 界面UI设计

    日期:2013-2-1  来源:GBin1.com 大家在程序开发或者界面设计中常常会遇到这样一些情况: 404 error 内容未找到 账户余额不够 文件没有找到 等等 这 些典型的属于empty ...

  3. iOS 监听耳机插入和拔出[检索]

    iOS 监听耳机插入和拔出[检索] 使用通知的方式,添加收到通知的回调方法 [[NSNotificationCenter defaultCenter] addObserver:self selecto ...

  4. ios 网络状态获取_Network Kit X——网络检测工具箱

    你是否需要一款简洁实用的网络检测工具呢?来试试Network Kit X for Mac吧!Network Kit X Mac版是一款运行在MacOS平台上的网络检测工具箱.Network Kit X ...

  5. iOS 网络状态判断方案(支持iOS11和iPhoneX)

    在之前的iPhone中.我们可以根据导航栏上方的网络状态view.来判断网络状态.(这种方案本来就不太好) 并且,这种方案在iPhone X 手机上.不可使用. 那么,在iPhone X 或者之前的手 ...

  6. 微信小程序播放音频,ios静音状态下无声音、音频播放创建多个等问题

    首先需要全局设置ios静音模式下播放声音,当然此方法也可以设置其他参数,[微信开发文档地址] wx.setInnerAudioOption(Object object) 基础库 2.3.0 开始支持, ...

  7. IOS选中按钮状态的记录

    IOS选择按钮状态的记录 @interface NJTabBar() {NJTabBarButton *_selectedButton; } @property(nonatomic,strong)UI ...

  8. iOS 后台运行实现总结

    原文:http://www.jianshu.com/p/d3e279de2e32 iOS 后台运行的规则 应用的运行状态分为以下五种: Not running:应用还没有启动,或者应用正在运行但是途中 ...

  9. iOS Core Bluetooth_1 概述

    章节连接 iOS Core Bluetooth_1 概述 iOS Core Bluetooth_2 基础知识 iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现 ...

最新文章

  1. 更改mvc版本的时候,手动修改交3.0改到4.0,将razor改到2.0,仍然提示出现错误,mvc3.0...
  2. PDF转换器安装教程
  3. 黑马2016java_2016年成功的Java开发人员简介
  4. vim文本编辑器的配置vimrc
  5. asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整...
  6. JUnit编写单元测试代码注意点小结
  7. 关于Ext checkboxfiled 获取值为 on的解决办法
  8. 丁香园 (http://www.dxy.cn)这个名字听着
  9. 小米手机 更换app图标失败的解决方法
  10. DM6437烧写总结
  11. matplotlib添加字体、字体格式自定义
  12. Python案例实操3-电影数据分析
  13. java 碳架山地车寿命_关于自行车的4大“谣言” 铝合金车架寿命只有五年
  14. MySQL查询以逗号隔开的字符串
  15. 掌上医院:手机生活助手
  16. 隐马尔科夫(HMM)的Matlab实现
  17. NFC framework introduce(二)
  18. 什么叫「人的格局」?是否有必要培…
  19. pyecharts制作中国地图
  20. 计算机VB给abc排序编程,初学者必知:VB10个小编程

热门文章

  1. 微信小程序计算时间差
  2. 【Java集合】集合是什么?为什么要用集合?
  3. 怎么理解预训练模型?
  4. python type() 判断数据类型
  5. cesium 加载geojson 贴3dtiles
  6. matlab版本转换
  7. python投票系统项目ppt_python fastApi实战项目 - 爱投票管理系统(一)
  8. error: cannot connect to daemon解决办法
  9. 软件项目需求调研过程
  10. oracle通信通道的文件结尾_Oracle错误——ORA-03113:在通信信道文件的末尾 解决方案...