如何在不使用AudioSessionSetProperty的情况下路由到kAudioSessionProperty_OverrideCategoryEnableBluetoothInput

时间:2013-10-02 10:32:11

标签: ios bluetooth avfoundation

我的iOS6和工作代码将蓝牙设置为输出:

// create and set up the audio session
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];
[audioSession setActive: YES error: nil];

// set up for bluetooth microphone input
UInt32 allowBluetoothInput = 1;
OSStatus stat = 0;
stat = AudioSessionSetProperty (
                                         kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
                                         sizeof (allowBluetoothInput),
                                         &allowBluetoothInput
                                         );

自iOS7以来,不推荐使用AudioSessionSetProperty方法。在此线程How Do I Route Audio to Speaker without using AudioSessionSetProperty?之后,您可以将输出更改为AVAudioSessionPortOverrideSpeaker或AVAudioSessionPortOverrideNone,但此处没有蓝牙选项。

我的目标是支持不使用A2DP但使用HFP的蓝牙设备。

那么如何在不使用弃用方法的情况下实现这一目标呢?

2 个答案:

答案 0 :(得分:6)

展开我的previous answer and comment

您将使用AVAudioSession方法

- (BOOL)setCategory:(NSString *)category 
        withOptions:(AVAudioSessionCategoryOptions)options 
              error:(NSError **)outError 

category作为
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryRecord

options
AVAudioSessionCategoryOptionAllowBluetooth

在你的回复中你说

  

这是不一样的,因为只允许A2DP蓝牙

但根据Apple文档

  

AVAudioSessionCategoryOptionAllowBluetooth
  允许蓝牙免提设备显示为可用的输入路径。

我明白这意味着蓝牙HFP,我认为是你所追求的。至于“强制”,Apple并不太热衷于强制/覆盖操作系统控制用户体验设备行为的应用程序。

可能这在实践中不起作用 - 我无法测试它。大概你有,但它失败了(你没有在你的问题中指出)。但是你在这个问题上达到了Apple的文档限制。如果你真的无法让它工作,我会倾向于使用已弃用的C接口,并准备对iOS8进行更改。

答案 1 :(得分:2)

通过参考此answer,我想出了以下内容:

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error];
    NSArray* routes = [audioSession availableInputs];
    for (AVAudioSessionPortDescription* route in routes)
    {
        if (route.portType == AVAudioSessionPortBluetoothHFP)
        {
            [audioSession setPreferredInput:route error:nil];
        }
    }

它似乎与旧属性覆盖的工作方式相同,并重定向输入和输出免提设备。