在你读这篇文章之前,如果你不嫌读英文太累,推荐阅读下苹果iOS Human Interface Guidelines中Sound这一章。


选择一个Category

AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound

——用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音

AVAudioSessionCategorySoloAmbient 或 kAudioSessionCategory_SoloAmbientSound

——类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音

AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback

——用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音

AVAudioSessionCategoryRecord 或 kAudioSessionCategory_RecordAudio

———用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。

AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord

——用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。

注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

设置Category

[objc] view plaincopy
  1. NSError *setCategoryError = nil;
  2. BOOL success = [[AVAudioSession sharedInstance]
  3. setCategory: AVAudioSessionCategoryAmbient
  4. error: &setCategoryError];
  5. if (!success) { /* handle the error in setCategoryError */ }

Activate & Deactivate AudioSession

[objc] view plaincopy
  1. NSError *error = nil;
  2. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  3. BOOL ret = [audioSession setActive:YES error:&error];
  4. if (!ret)
  5. {
  6. NSLog(@"%s - activate audio session failed with error %@", __func__,[error description]);
  7. }
[objc] view plaincopy
  1. NSError *error = nil;
  2. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  3. //Note: Set AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation to resume other apps' audio.
  4. BOOL ret = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
  5. if (!ret)
  6. {
  7. }

Audio Route的选择

当你的iPhone接有多个外接音频设备时(耳塞,蓝牙耳机等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。

当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord这个category下,听筒会成为默认的输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。


PlayandRecord下切换到扬声器

除了让用户手动选择,你也可以通过以下两种方法在程序里进行切换

1. 修改Category的默认行为:

[objc] view plaincopy
  1. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];

2. OverrideOutputAudioPort:

[objc] view plaincopy
  1. [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

关于这两种方法的区别 这篇文章 中有详细的说明。

[iOS]iOS AudioSession详解 Category选择 听筒扬声器切换相关推荐

  1. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  2. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  3. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  4. Android 听筒扬声器切换 并且监听音量变化

    记录一下. 在activity 监听按键: @Override public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode = ...

  5. Android 听筒扬声器切换(多机型兼容、兼容5.0以上)

    目录 目录 亲测有效机型案例有限仅供参考 代码 用法 Demo Feature 本以为是个很简单的切换,没想到搞了快一天.网络上各种答案,各种坑,浪费了大量的时间. 亲测有效机型(案例有限.仅供参考) ...

  6. iOS教程:详解iOS多图下载的缓存机制

    ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...

  7. iOS TableView 使用详解

     IOS TableView 详解 一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ...

  8. iOS runtime 底层详解、内部原理、场景应用

    前言学:位域和共用体 一:isa指针--runtime之前的学习 1.1:苹果应用的按位或.按位与 二:类对象信息 2.1:类对象信息:rw_t 2.2:类对象信息:方法缓存(很关键) 2.2:类对象 ...

  9. iOS 内购详解-代码篇

    内购项目-代码篇 一.分步骤说明 1.获取商品列表 2.苹果服务器返回的可购买商品 3.下单购买商品 4.购买队列状态变化,判断购买状态是否成功 5.交易验证 6.拿到的收据信息是,此App所有购买的 ...

最新文章

  1. Swift 循环、数组 字典的遍历
  2. curl访问nagios中Host Status Details For All Host Groups页面的方法
  3. BIEE连接数据库的方法
  4. 前端学习(581):使用element调试dom 查看和调试dom节点
  5. div+css二级菜单
  6. leetcode组队学习——查找(一)
  7. matlab gpu 编程 macOS,MATLAB GPU编程基础
  8. JavaScript高级程序设计(第四版) 第二章 HTML中的javascript
  9. [Python]通过有道词典API获取单词发音MP3
  10. 百度智能云-文字识别SDK-识别验证码Demo
  11. 用手机访问计算机共享资源,怎么进入共享文件夹?手机访问电脑局域网共享文件夹的方法...
  12. jqGrid双击事件,并获取双击行的各个属性值
  13. html打开无法显示网页怎么回事,Win7打开网页提示“Internet Explorer无法显示该页面”如何解决?...
  14. 真无线蓝牙耳机哪款适合新手?数码发烧友最全盘点,高实用性蓝牙耳机
  15. mysql中sum函数使用_MySQL中的SUM函数使用教程_MySQL
  16. Crack:::Stimulsoft Ultimate 2023.1.2
  17. OpenCV入门(3):图像的组成,色彩空间及通道的分离合并
  18. 如何查找和掌握所有YouTube订阅
  19. 补充:爬虫技术成就了这些商业公司的
  20. 【工具推荐】Adobe Reader看PDF文件点击链接跳转,返回原位置方法

热门文章

  1. python的datetime举例_Python datetime.timedelta()用法及代码示例
  2. 四十四、Stata统计操作和绘图
  3. 二十、App爬虫环境搭建并测试监听微信
  4. 从最小二乘法到卡尔曼滤波
  5. 上海人工智能实验室刘宇:从感知AI的发展理解决策AI的未来
  6. CCF-百度松果基金正式“亮出”申报细则,加码产学研前沿合作
  7. 今晚直播 | 清华大学NLP组秦禹嘉:基于自然语言解释的数据增强
  8. 从Wasserstein距离、对偶理论到WGAN
  9. 重磅推荐 | 11个名企NLP项目,硅谷科学家帮你转型
  10. 图像分割综述:FCN、U-Net、PSPNet、DeepLab