AVAudioSessionでヘッドフォンの抜き差しを検知する
こんにちは、プログラマのLFです。
いま実装しているiOSアプリで
AVAudioPlayerの再生中にヘッドフォン(イヤホン)の抜き差しが発生したときに
再生を一時停止したり、再度再生したりする処理を実装する必要が生じました。
手元の書籍(過去記事参照)で調べたところ
「AudioToolbox」フレームワークの「AudioSession」クラスを
利用することで可能なことがわかりましたが、
「AudioSession」クラスはiOS7以降では非推奨となってしまったため
代わりの方法をGoogle先生にお聞きしたところ
「AVFoundation」フレームワークの
「AVAudioSession」クラスを利用することで代用が可能とのこと。
しかし、いろいろ調べたのですがそのものズバリなサンプルコードがなかなか見つからず。
みなさん困っていないのかしら。
それぐらい自分ですらすら書けてしまうということなのかな。
検索ワードをいろいろ変えながらなんとかサンプルコードを見つけることができたので
同じ問題にぶつかった方がもしいらっしゃったときのために
サンプルコードを載せておきます。
おそらく自分の備忘録になる可能性が高いですが(苦笑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //---イヤホンの抜き差しを検知するための処理 [[AVAudioSession sharedInstance] setActive:YES error:nil]; // Notificationの設定 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeAudioSessionRoute:) name:AVAudioSessionRouteChangeNotification object:nil]; //---ここまで } - (void)didChangeAudioSessionRoute:(NSNotification *)notification { // ヘッドホンが刺さっていたか取得 BOOL (^isJointHeadphone)(NSArray *) = ^(NSArray *outputs){ for (AVAudioSessionPortDescription *desc in outputs) { if ([desc.portType isEqual:AVAudioSessionPortHeadphones]) { return YES; } } return NO; }; // 直前の状態を取得 AVAudioSessionRouteDescription *prevDesc = notification.userInfo[AVAudioSessionRouteChangePreviousRouteKey]; if (isJointHeadphone([[[AVAudioSession sharedInstance] currentRoute] outputs])) { if (!isJointHeadphone(prevDesc.outputs)) { //ヘッドフォンが刺さった //処理 } } else { if(isJointHeadphone(prevDesc.outputs)) { //ヘッドフォンが抜かれた //処理 } } } |
参考サイト:
さくっとヘッドホンの抜き差しを取得する