Help us understand the problem. What is going on with this article?

さくっとヘッドホンの抜き差しを取得する

More than 5 years have passed since last update.

必要があって調べていましたが、
ネット上の情報が古くなってきていると感じたので書きます。

AVAudioSessionを使います。

init
// 明示的にアクティブにしておく必要があった
[[AVAudioSession sharedInstance] setActive:YES error:nil];

// Notificationの設定
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeAudioSessionRoute:) name:AVAudioSessionRouteChangeNotification object:nil];

で、上で指定した`didChangeAudioSessionRoute:に状態の変更が通知されるので、今どうなってるか調べればいい。

notification
- (void)didChangeAudioSessionRoute:(NSNotification *)notification
{
    for (AVAudioSessionPortDescription *desc in [[[AVAudioSession sharedInstance] currentRoute] outputs]) {
        if ([desc.portType isEqual:AVAudioSessionPortHeadphones]) {
            NSLog(@"ヘッドホン刺さった");
        } else {
            NSLog(@"ヘッドホン抜けた");
        }
    }
}

さくっとならコレで十分だと思いますが、本当に ヘッドホンが抜けた とか 刺さった 状態であるかどうかは、直前の状態を見ないとわからないので、

もうちょっと詳しく書くと以下のようになります。

notification2
- (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)) {
            NSLog(@"ヘッドフォンが刺さった");
        }
    } else {
        if(isJointHeadphone(prevDesc.outputs)) {
            NSLog(@"ヘッドフォンが抜かれた");
        }
    }
}

userInfoで直前の状態が取れるので、その時ヘッドホンが刺さっていたかどうかを調べています。

なんだか、あまり効率的ではなさそうですが

userInfoからAVAudioSessionRouteChangeReasonKeyAVAudioSessionRouteChangeReasonが取得できますので、その中の

  • AVAudioSessionRouteChangeReasonNewDeviceAvailable
  • AVAudioSessionRouteChangeReasonOldDeviceUnavailable

ここら変を見るようにすればもうちょっと無駄なく書けそうかな。

naonya3
iOSアプリエンジニアとして LIVE配信プラットフォームをつくってます
http://naonya3.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした