読者です 読者をやめる 読者になる 読者になる

オーディオプラグの抜き差しの検知

iOSでヘッドフォン(ヘッドセットではない)が接続されているか否かを判断する方法.

ルーティング変更を検知すると通知が来るようにNSNotificationCenterに登録する. また終了時にNSNotificationCenterからselectorを削除する事を忘れてはいけない. registerはアプリ起動時に, unregisterはアプリ終了時に呼び出すようにするのが良いだろう.

-(void)registerNotifications
{
  [[NSNotificationCenter defaultCenter] addObserver: self
                                           selector: @selector(routeChangeNotification:)
                                               name: AVAudioSessionRouteChangeNotification
                                             object: [AVAudioSession sharedInstance]];
}

-(void)unregisterNotifications
{
  [[NSNotificationCenter defaultCenter] removeObserver: self
                                                  name: AVAudioSessionRouteChangeNotification
                                                object: [AVAudioSession sharedInstance]];
}

selectorとして登録したメソッド内ではルーティング分ループで回し有線とBluetooth接続のヘッドフォンポートがあるか否かを調べる. iOSは有線とBluetooth接続が同時に発生する可能性があるためフラグ管理する時は注意が必要. また, この通知は起動時には呼ばれないので, 起動時にも呼べるようにしておく必要がある.

-(void)routeChangeNotification:(NSNotification*)note
{
  AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
  for (AVAudioSessionPortDescription* desc in [route outputs])
    {
      if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
        {
          // 有線接続されている
        }
      else if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP])
        {
          // A2DPでBluetooth接続されている
        }
    }
}