[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

[objc] view
plain
copy

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

Activate & Deactivate AudioSession

[objc] view
plain
copy

  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
plain
copy

  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
plain
copy

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

2. OverrideOutputAudioPort:

[objc] view
plain
copy

  1. [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
     
时间: 2024-10-03 09:43:00

[iOS]iOS AudioSession详解 Category选择 听筒扬声器切换的相关文章

iOS UIView动画详解(Objective-C)

    我在之前的一篇博客中<iOS UIView动画详解(Swift)>讲解了使用Swift来实现UIView类下面提供的多种动画效果,如位置动画.旋转动画.缩放动画.颜色动画.透明度动画等等.为了这个题目的完整性,今天我使用Objective-C来完全重写以上的所有的动画.项目案例已经上传至:https://github.com/chenyufeng1991/iOS-UIView-Animation  中的Animation-OC文件夹下,另一个目录下则是Swift实现的动画. (1)位置

IOS UITableViewCell使用详解

IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier; Cell的初始化方法,可以设置一个风格和标识符,风格的枚举如下: ? 1 2 3 4 5 6 typedef NS_ENUM(NSInteger, UITableViewCellStyle) {     UITableViewCellStyleD

IOS 指纹识别详解及实例代码_IOS

IOS 指纹识别,这里整理下项目中用的知识. IOS 指纹识别现在,在要求安全与效率兼得的时候,普通密码已不能满足我们的要求,指纹识别就这样诞生了. 每个人都有自己专属的指纹,在需要支付等输入密码的地方,我们只需轻轻一按即可,避免了输入密码的繁琐步骤,更加安全,而且妈妈再也不用担心我们忘记密码. 其实,听着高大上,实现起来特别简单,因为苹果已经帮我们封装好了,我们只需要简单的调用就好了. 1.首先,我们需要导入头文件: #import <LocalAuthentication/LocalAuth

iOS开发笔记--详解UILabel的相关属性设置_IOS

在iOS编程中UILabel是一个常用的控件,下面分享一下UILabel的相关属性设置的方法. 很多学习iOS6编程都是从storyboard开始,用到UILabel时是将控件拖到storyboard中生成实现,如果想要在-(void)viewDidLoad中用代码如[_label initWithFrame:CGRectMake(X,Y,WIDTH,HEIGHT)]方法改变拖拽到storyboard的label的大小是行不通的,因为程序加载时先执行了-(void)viewDidLoad的代码,

IOS 多线程GCD详解_IOS

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种disp

iOS开发之详解正则表达式

  正则表达式(广为所知的"regex")是一个字符串或一个字符序列来说明一种模式,把它作为一个搜索字符串-非常强大! 在一个文本编辑器或文字处理器中普通的旧式搜索只允许你进行简单的匹配.正则表达式可以实现这样简单的搜索,它还能让你更进一步地按模式搜索,例如,在两个数字后跟一个字母,或者,三个字母后跟一个连字符. 这种模式匹配能让你做更有用的事,如验证字段(电话号码,邮箱地址),检查用户输入,执行更高级的文本操作等等. 如果你渴望了解更多关于正则表达式在iOS中的用法,看一些本教程之外

Cisco asa 5510升级IOS和ASDM详解

本文主要从技术层面向大家详细的介绍了如何去升级IOS和ASDM,并且文章给出了具体的配置过程,详细通过此文使你有意匪浅.show version 查看当前运行的系统信息,包括启动文件(即IOS)等show boot 查看当前的IOS信息show asdm image 查看当前运行的ASDM信息copy nvram:/filename tftp://ip/filename 用tftp协议进行文件传输boot system file 设置IOS启动文件asdm image file 设置asdm启动

iOS UIAppearance使用详解

  iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下两个方法. + (id)appearance 这个方法是统一全部改,比如你设置UINavBar的tintColor,你可以这样写:[[UINavigationBar appearance] setTintColor:myColor]; + (id)appearanceWhenContainedI

iOS之Block详解

一.Block定义 二.Block原理 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // main.m   int main(int argc, const char * argv[]) {     @autoreleasepool {           //        static int age = 20;         __block int age = 20;                   void (^blco