iOS 藍牙耳機切換

AVAudioSession 藍牙支持源碼session

增長AVAudioSession藍牙的支持實際上比你想象的代碼要少的多。事實上,整個audio session API很簡單,以致於開發要麼很容易要麼異常困難。猜猜哪一個分類AVAudioSession藍牙支持集成?ide

據我所知增長藍牙到AVAudioSession包括不少特性。讓咱們逐一展開:學習

打開bluetooth audioui

首先,你須要明確地通知AVAudioSession你容許聲音能夠被輸出到藍牙設備。如下是設定你的聲音類別:spa

[session setCategory:AVAudioSessionCategoryPlayAndRecord.net

          withOptions:AVAudioSessionCategoryOptionAllowBluetooth
                error:&error];
記住,你的audio session category 告訴iOS系統你將如何在你的App中應用音頻信號。好比,

AVAudioSessionCategoryPlayAndRecord 意思是擁有播放和錄音的功能。線程

總之,咱們感興趣的是可選的參數。code

經過增長AVAudioSessionCategoryOptionAllowBluetooth, 咱們容許iOS經過藍牙音頻設備來播放咱們App的聲音。對象

注:我已經見過在一個項目中屢次設置了AVAudioSession類別。不要輕易地使用setCategory是我從iOS中學習到的關於audio的知識。ip

實際上,在大多數狀況下,你只須要設置一次。爲何?首先它是一個複雜的操做。

若是它在主線程中被執行,它將使你失去一秒鐘的UI響應。更重要的是,處處設置category將致使奇怪的行爲-你將沒法知道在何時audio將送達揚聲器或耳麥……

在audio route中轉換

當你在實現AVAudioSession藍牙功能的時候,你可能但願能夠切換音頻設備。

惋惜,在文檔中彷佛沒有一個清晰的定義方法。

不過有不少方法來實現。然而,我找到的最可行的方法是設置preferred audio input.

如下是例子:

Switching to bluetooth

- (AVAudioSessionPortDescription*)bluetoothAudioDevice
{
     NSArray * bluetoothRoutes = @[AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE, AVAudioSessionPortBluetoothHFP];
     return  [ self  audioDeviceFromTypes:bluetoothRoutes];
}
 
- (AVAudioSessionPortDescription*)builtinAudioDevice
{
     NSArray * builtinRoutes = @[AVAudioSessionPortBuiltInMic];
     return  [ self  audioDeviceFromTypes:builtinRoutes];
}
 
- (AVAudioSessionPortDescription*)speakerAudioDevice
{
     NSArray * builtinRoutes = @[AVAudioSessionPortBuiltInSpeaker];
     return  [ self  audioDeviceFromTypes:builtinRoutes];
}
 
- (AVAudioSessionPortDescription*)audioDeviceFromTypes:( NSArray *)types
{
     NSArray * routes = [[AVAudioSession sharedInstance] availableInputs];
     for  (AVAudioSessionPortDescription* route  in  routes)
     {
         if  ([types containsObject:route.portType])
         {
             return  route;
         }
     }
     return  nil ;
}
 
- ( BOOL )switchBluetooth:( BOOL )onOrOff
{
     NSError * audioError =  nil ;
     BOOL  changeResult =  NO ;
     if  (onOrOff ==  YES )
     {
         AVAudioSessionPortDescription* _bluetoothPort = [ self  bluetoothAudioDevice];
         changeResult = [[AVAudioSession sharedInstance] setPreferredInput:_bluetoothPort
                                                      error:&audioError];
     }
     else
     {
         AVAudioSessionPortDescription* builtinPort = [ self  builtinAudioDevice];
         changeResult = [[AVAudioSession sharedInstance] setPreferredInput:builtinPort
                                                      error:&audioError];
     }
     return  changeResult;
}
額,有好多的代碼!好吧,最重要的地方是最後一個方法中設置preferred input。其餘代碼僅僅是得到正確的面對揚聲器,耳麥或藍牙的AVAudioSessionPortDescription對象。

Switching to speaker

- ( BOOL )switchSpeaker:( BOOL )onOrOff
{
     NSError * audioError =  nil ;
     BOOL  changeResult =  NO ;
     if  (onOrOff ==  YES )
     {
         changeResult = [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                                            error:&audioError];
     }
     else
     {
         AVAudioSessionPortDescription* builtinPort = [ self  builtinAudioDevice];
         changeResult = [[AVAudioSession sharedInstance] setPreferredInput:builtinPort
                                                                     error:&audioError];
     }
     return  changeResult;
}

Switching to earpiece

- ( BOOL )switchEarphone:( BOOL )onOrOff
{
     return  [ self  switchSpeaker:!onOrOff];
}
這個很容易。僅僅是上面方法的相反操做。

AVAudioSession藍牙支持是一個使人卻步的工做。

並且在網上也沒有太多介紹它的信息。

我但願這篇文章可以幫助到你。