菜鸟教程小白 发表于 2022-12-12 19:52:30

ios - 如何检测 iOS 中是否连接了 HFP 或 A2DP?


                                            <p><p>我正在开发一个可以通过 HFP 设备播放音乐的项目。但是这里有个问题,我想在播放音乐的时候检测是连接了HFP还是A2DP。</p>
<p>现在我正在使用 AVFoundation 框架来执行此操作。代码如下:</p>
<pre><code>- (BOOL)isConnectedToBluetoothPeripheral
{
    BOOL isMatch = NO;
    NSString* categoryString = .category;
    AVAudioSessionCategoryOptions categoryOptions = .categoryOptions;
    if ((! &amp;&amp;
         !) ||
      categoryOptions != AVAudioSessionCategoryOptionAllowBluetooth)
    {
      NSError * error = nil;
      [ setCategory:AVAudioSessionCategoryPlayAndRecord
                                       withOptions:AVAudioSessionCategoryOptionAllowBluetooth
                                             error:&amp;error];
      if (error) {
            [ setCategory:categoryString
                                             withOptions:categoryOptions
                                                   error:&amp;error];
            return isMatch;
      }
    }
   
      NSArray * availableInputs = .availableInputs;
      for (AVAudioSessionPortDescription *desc in availableInputs)
      {
            if ([ isEqualToString:AVAudioSessionPortBluetoothA2DP] || [ isEqualToString:AVAudioSessionPortBluetoothHFP])
            {
                  isMatch = YES;
                  break;
            }
      }
      if (!isMatch)
      {
            NSArray * outputs = [[ currentRoute] outputs];
            
            for (AVAudioSessionPortDescription * desc in outputs)
            {
                if ([ isEqualToString:AVAudioSessionPortBluetoothA2DP] || [ isEqualToString:AVAudioSessionPortBluetoothHFP])
                {
                        isMatch = YES;
                        break;
                }
            }
      }
      
      NSError * error = nil;
      [ setCategory:categoryString
                                       withOptions:categoryOptions
                                             error:&amp;error];
   
      return isMatch;
}
</code></pre>
<p>效果很好,但又带来一个问题:在播放音乐时,使用这种方法检测HFP连接会导致音乐播放中断大约两秒。</p>
<p>所以我尝试了另一种可以减少检测HFP连接效果的方法。我正在使用标志</p>
<pre><code>static BOOL isHFPConnectedFlag
</code></pre>
<p>指示是否连接了 HFP 或 A2DP。我使用以前的方法只检测一次连接(当应用程序启动时)并将结果保存到 isHFPConnectedFlag 中。更重要的是,我观察 AudioSessionRouteChange 来同步连接状态:</p>
<pre><code>[ addObserver:self selector:@selector(handleAudioSessionRouteChangeWithState:) name:AVAudioSessionRouteChangeNotification object:nil];
</code></pre>
<p>当路由改变原因是<code>AVAudioSessionRouteChangeReasonNewDeviceAvailable</code>或<code>AVAudioSessionRouteChangeReasonOldDeviceUnavailable</code>我可以知道HFP是连接还是断开。不幸的是,当我在 iPhone 中连接一些 HFP 时,系统不会发布此通知,因此在这种情况下我无法检测到连接。</p>
<p>有谁知道实现这一点的原因或更好的方法(在不中断音乐播放的情况下检测 HFP 连接)?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你可以这样使用! </p>

<pre><code>    -(BOOL) bluetoothDeviceA2DPAvailable {

    BOOL available = NO;
    AVAudioSession *audioSession = ;
    AVAudioSessionRouteDescription *currentRoute = ;

    for (AVAudioSessionPortDescription *output in currentRoute.outputs) {
      if (([ isEqualToString:AVAudioSessionPortBluetoothA2DP] ||
             [ isEqualToString:AVAudioSessionPortBluetoothHFP])) {
            available = YES;
            break;
      }
    }
    return available;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何检测 iOS 中是否连接了 HFP 或 A2DP?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37157252/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37157252/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何检测 iOS 中是否连接了 HFP 或 A2DP?