[iOS]iOS AudioSession详解 Category选择 听筒扬声器切换
在你读这篇文章之前,如果你不嫌读英文太累,推荐阅读下苹果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
- NSError *setCategoryError = nil;
- BOOL success = [[AVAudioSession sharedInstance]
- setCategory: AVAudioSessionCategoryAmbient
- error: &setCategoryError];
- if (!success) { /* handle the error in setCategoryError */ }
Activate & Deactivate AudioSession
- NSError *error = nil;
- AVAudioSession *audioSession = [AVAudioSession sharedInstance];
- BOOL ret = [audioSession setActive:YES error:&error];
- if (!ret)
- {
- NSLog(@"%s - activate audio session failed with error %@", __func__,[error description]);
- }
- NSError *error = nil;
- AVAudioSession *audioSession = [AVAudioSession sharedInstance];
- //Note: Set AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation to resume other apps' audio.
- BOOL ret = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
- if (!ret)
- {
- }
Audio Route的选择
当你的iPhone接有多个外接音频设备时(耳塞,蓝牙耳机等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。
当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord
这个category下,听筒会成为默认的输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。
PlayandRecord下切换到扬声器
除了让用户手动选择,你也可以通过以下两种方法在程序里进行切换
1. 修改Category的默认行为:
- [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
2. OverrideOutputAudioPort:
- [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
关于这两种方法的区别 这篇文章 中有详细的说明。
[iOS]iOS AudioSession详解 Category选择 听筒扬声器切换相关推荐
- IOS 多线程04-GCD详解 底层并发 API
IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS核心动画详解swift版----基础动画
2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...
- Android 听筒扬声器切换 并且监听音量变化
记录一下. 在activity 监听按键: @Override public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode = ...
- Android 听筒扬声器切换(多机型兼容、兼容5.0以上)
目录 目录 亲测有效机型案例有限仅供参考 代码 用法 Demo Feature 本以为是个很简单的切换,没想到搞了快一天.网络上各种答案,各种坑,浪费了大量的时间. 亲测有效机型(案例有限.仅供参考) ...
- iOS教程:详解iOS多图下载的缓存机制
ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...
- iOS TableView 使用详解
IOS TableView 详解 一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ...
- iOS runtime 底层详解、内部原理、场景应用
前言学:位域和共用体 一:isa指针--runtime之前的学习 1.1:苹果应用的按位或.按位与 二:类对象信息 2.1:类对象信息:rw_t 2.2:类对象信息:方法缓存(很关键) 2.2:类对象 ...
- iOS 内购详解-代码篇
内购项目-代码篇 一.分步骤说明 1.获取商品列表 2.苹果服务器返回的可购买商品 3.下单购买商品 4.购买队列状态变化,判断购买状态是否成功 5.交易验证 6.拿到的收据信息是,此App所有购买的 ...
最新文章
- Swift 循环、数组 字典的遍历
- curl访问nagios中Host Status Details For All Host Groups页面的方法
- BIEE连接数据库的方法
- 前端学习(581):使用element调试dom 查看和调试dom节点
- div+css二级菜单
- leetcode组队学习——查找(一)
- matlab gpu 编程 macOS,MATLAB GPU编程基础
- JavaScript高级程序设计(第四版) 第二章 HTML中的javascript
- [Python]通过有道词典API获取单词发音MP3
- 百度智能云-文字识别SDK-识别验证码Demo
- 用手机访问计算机共享资源,怎么进入共享文件夹?手机访问电脑局域网共享文件夹的方法...
- jqGrid双击事件,并获取双击行的各个属性值
- html打开无法显示网页怎么回事,Win7打开网页提示“Internet Explorer无法显示该页面”如何解决?...
- 真无线蓝牙耳机哪款适合新手?数码发烧友最全盘点,高实用性蓝牙耳机
- mysql中sum函数使用_MySQL中的SUM函数使用教程_MySQL
- Crack:::Stimulsoft Ultimate 2023.1.2
- OpenCV入门(3):图像的组成,色彩空间及通道的分离合并
- 如何查找和掌握所有YouTube订阅
- 补充:爬虫技术成就了这些商业公司的
- 【工具推荐】Adobe Reader看PDF文件点击链接跳转,返回原位置方法
热门文章
- python的datetime举例_Python datetime.timedelta()用法及代码示例
- 四十四、Stata统计操作和绘图
- 二十、App爬虫环境搭建并测试监听微信
- 从最小二乘法到卡尔曼滤波
- 上海人工智能实验室刘宇:从感知AI的发展理解决策AI的未来
- CCF-百度松果基金正式“亮出”申报细则,加码产学研前沿合作
- 今晚直播 | 清华大学NLP组秦禹嘉:基于自然语言解释的数据增强
- 从Wasserstein距离、对偶理论到WGAN
- 重磅推荐 | 11个名企NLP项目,硅谷科学家帮你转型
- 图像分割综述:FCN、U-Net、PSPNet、DeepLab