2016-05-11 31 views
1

私はHFPデバイス経由で音楽を再生できるプロジェクトに取り組んでいます。しかし、ここでは、音楽が再生されているときにHFPまたはA2DPが接続されているかどうかを検出したいという問題があります。iOSでHFPまたはA2DPが接続されているかどうかを検出するにはどうすればよいですか?

今私はこれを行うためにAVFoundationフレームワークを使用しています。ここでは、コードです:

- (BOOL)isConnectedToBluetoothPeripheral 
{ 
    BOOL isMatch = NO; 
    NSString* categoryString = [AVAudioSession sharedInstance].category; 
    AVAudioSessionCategoryOptions categoryOptions = [AVAudioSession sharedInstance].categoryOptions; 
    if ((![categoryString isEqualToString:AVAudioSessionCategoryPlayAndRecord] && 
     ![categoryString isEqualToString:AVAudioSessionCategoryRecord]) || 
     categoryOptions != AVAudioSessionCategoryOptionAllowBluetooth) 
    { 
     NSError * error = nil; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord 
             withOptions:AVAudioSessionCategoryOptionAllowBluetooth 
               error:&error]; 
     if (error) { 
      [[AVAudioSession sharedInstance] setCategory:categoryString 
              withOptions:categoryOptions 
                error:&error]; 
      return isMatch; 
     } 
    } 

     NSArray * availableInputs = [AVAudioSession sharedInstance].availableInputs; 
     for (AVAudioSessionPortDescription *desc in availableInputs) 
     { 
      if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP]) 
      { 
        isMatch = YES; 
        break; 
      } 
     } 
     if (!isMatch) 
     { 
      NSArray * outputs = [[[AVAudioSession sharedInstance] currentRoute] outputs]; 

      for (AVAudioSessionPortDescription * desc in outputs) 
      { 
       if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP]) 
       { 
         isMatch = YES; 
         break; 
       } 
      } 
     } 

     NSError * error = nil; 
     [[AVAudioSession sharedInstance] setCategory:categoryString 
             withOptions:categoryOptions 
               error:&error]; 

     return isMatch; 
} 

それはうまく動作しますが、別の問題を引き起こす:音楽が再生されているとき、HFPの接続を検出するために、このメソッドを使用すると、音楽が約2秒間割り込み遊ぶようになります。

私はHFP接続を検出する効果を減らすことができる別の方法を試しました。私は旗を使用しています

static BOOL isHFPConnectedFlag 

HFPまたはA2DPが接続されているかどうかを示しています。以前の方法で接続を一度だけ検出し(アプリケーションが起動しているとき)、isHFPConnectedFlagに結果を保存します。しかも、私はAudioSessionRouteChangeが接続状態を同期するために守っ:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionRouteChangeWithState:) name:AVAudioSessionRouteChangeNotification object:nil]; 

ルート変更の理由がAVAudioSessionRouteChangeReasonNewDeviceAvailableまたはAVAudioSessionRouteChangeReasonOldDeviceUnavailable私はHFPを接続または切断されて知ることができるである

。残念ながら、iPhoneでHFPを接続すると、システムはこの通知を送信しないので、この状況で接続を検出できません。

誰でも、これを実装する理由や良い方法を知っていますか?音楽再生中断なしでHFP接続を検出していますか?ありがとうございました

答えて

0

あなたはこのように使うことができます!

-(BOOL) bluetoothDeviceA2DPAvailable { 

BOOL Available = NO; 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
AVAudioSessionRouteDescription *currentRoute = [audioSession currentRoute]; 

for (AVAudioSessionPortDescription *output in currentRoute.outputs) { 
    if (([[output portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || 
     [[output portType] isEqualToString:AVAudioSessionPortBluetoothHFP])) { 
     Available = YES; 
     break; 
    } 
} 
return Available; 

}

関連する問題