1. 程式人生 > >[iOS]iOS AudioSession詳解 Category選擇 聽筒揚聲器切換

[iOS]iOS AudioSession詳解 Category選擇 聽筒揚聲器切換

在你讀這篇文章之前,如果你不嫌讀英文太累,推薦閱讀下蘋果iOS Human Interface GuidelinesSound這一章。

選擇一個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,AVAudioSessionCategorySoloAmbientAVAudioSessionCategoryPlayback中的一種。


設定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 Human Interface Guidelines中Sound這一章。 選擇一個Category AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_

iOS AudioSession Category選擇 聽筒揚聲器切換kAudioSessionCategory_MediaPlayback

選擇一個Category AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound ——用於非以語音為主的應用,使用這個category的應用會隨著靜音鍵和螢幕關閉而靜音。並且不會中止其它應用播放聲

iOS繪圖CGContextRef

單獨 tsa 我們 分享 繪制線 cloc tcl attr 舉例 轉自:http://blog.csdn.net/u014286994/article/details/51333118 /* CoreGraphics - CGContext.h */ /** Grap

iOS AppDelegate 代理(啟動,開啟App,推送,通知)

//App將要啟動 - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions{ return YES;

IOS內購

介紹 最近開發的一款APP上架被駁回了,理由是: 上架的APP是培訓類,裡面金牌視訊課程需要購買,Android端使用支付寶,微信支付。 蘋果規定 數字化內容、App功能以及服務等,需要使用內購 真實世界中的服務(如一個俱樂部的會員資格)或物品(食物、衣物等

【Android】Android開發實現帶有反彈效果,仿IOS反彈scrollview教程

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先給大家看一下我們今天這個最終實現的效果圖: 這個是ios中的反彈效果。當然我

iOS塊語法(block程式設計)

——譯自Apple Reference Library《Blocks Programming Topic》 簡介 塊物件是C語言的句法和執行時特性。它類似於標準C函式,但可以將程式碼、變數繫結到堆(heap)、棧(stack)。一個塊還維護了一系列的狀態,這些狀態或資料

IOS UIScrollView——用法

UIScrollView是用來在螢幕上顯示那些在有限區域內放不下的內容。例如,在手機螢幕上顯示內容豐富的網頁或者很大的圖片。在這種情況下,需要使用者對螢幕內容進行拖動或縮放來檢視螢幕或視窗區域外的內容。 所以,ScrollView應該首先有一個視窗,用來顯示內容,其次,還要

iOS開發-Runtime

簡介 Runtime 又叫執行時,是一套底層的 C 語言 API,其為 iOS 內部的核心之一,我們平時編寫的 OC 程式碼,底層都是基於它來實現的。比如: [receiver message]; // 底層執行時會被編譯器轉化為: objc_msgSend(recei

IOS NSString 用法

//NSString 操作均不改變自身值 //構建字串 NSString *szTmp = @"A string"; //直接賦值 szTmp = nil; int n = 5; NSString *szMyString = [NSStr

iOS UITabBar屬性 UITabBarController 底部 UITabBarItem 間距調整

http://www.2cto.com/kf/201505/402189.html iOS UI Tab開發(iOS 8) tab這種樣式,類似於單選,可以叫radio-style,這是一個現在主流的layout-design,它讓APP內容結構清晰,開發分工邏輯明確

iOS開發-底層篇-Classios底層-class

前言:iOS的開發語言objective-c,它的真實面目是它不是真正的面嚮物件語言,而抽象理解為此而已。其實它就是C+,有個公式可以很好地詮釋那就是 OC = C + Runtime; 接下來我們就好好講講在Runtime下的objc-class。準備資料,objc

iOS AttributeString 使用

http://blog.csdn.net/hello_hwc/article/details/46731991 一個簡單的例子 繪製不同顏色不同字型的一個AttributeString,如圖 這裡寫圖片描述 程式碼 UILabel * Label = [[UIL

iOS學習--UIView~~~~~

不管你是使用系統的檢視還是建立自己的檢視,你需要理解UIView和UIWindow類所提供的基本結構。這些類提供了複雜的方法來管理檢視的佈局和展示。理解這些方法的工作非常重要,使你在應用發生改變時可以確認檢視有合適的行為。  檢視架構 fundamentals  大部分你想要視覺化操作都是由檢視物件-

IOS ----UIButton用法

這段程式碼動態的建立了一個UIButton,並且把相關常用的屬性都列舉了.希望對大家有用.   //這裡建立一個圓角矩形的按鈕UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];// 能夠定義的button型別有以下6種

iOS ReactiveCocoa 使用(四)

ReactiveCocoa常見類學習框架首要之處:個人認為先要搞清楚框架中常用的類,在RAC中最核心的類RACSiganl,搞定這個類就能用ReactiveCocoa開發了。1、RACSiganl:訊號類,一般表示將來有資料傳遞,只要有資料改變,訊號內部接收到資料,就會馬上發出資料。注意:訊號類(RACSig

[iOS進階]iOS快取機制

1、為什麼需要快取 應用需要離線工作的主要原因就是改善應用所表現出的效能。將應用內容快取起來就可以支援離線。我們可以用兩種不同的快取來使應用離線工作。 第一種是按需快取,這種情況下應用快取起請求應答,就和Web瀏覽器的工作原理一樣;第二種是預快

IOS面試題(一)

這套題目來自cocoachina的版主大大招人時候的題目,論壇各路大神都覺得偏難。自己看了一下,發現很多是自己知道,但又說不上來的感覺。所以覺得有必要梳理完善一下,題很多,反正寫到哪算哪吧!另外,因為我不是C/C++ 或寫 mac “發家” 所以還是有解答不上來的,但是關

iOS推送(二)收到通知跳到指定頁面的處理辦法

接著上一篇繼續,當接到通知需要的操作 一、APP在前臺        實現效果,在前臺無論在那個頁面都在頂部展示一個橫條,顯示推送資訊,點選時跳到自己處理的頁面(10秒不點選自動移除這個橫條view)        直接上程式碼吧,講解一下思路,有問題留言        當

iOS copy mutableCopy

一、從面向物件到Objective-C概覽copy 1、面向物件: In object-oriented programming, object copying is creating a copy of an existing object, a u