2012-05-03 25 views
1

iPadで作業しています。 私はいつユーザーのプラグインヘッドフォンを検出したいと思います。まず、プロパティkAudioSessionProperty_AudioRouteChangeでリスナーを使用しました。ヘッドフォンがまだ接続されているときに、スピーカーに切り替えるためのボタンを追加することを決定するまでは、すべてうまく機能していました。だから私は今問題に直面している、誰かがそれを修正する考えを持っていたかもしれない。ここでオーディオルートが変更されない場合のヘッドフォンプラグインプラグインイベント - iOS

はシナリオです:

  • 私はヘッドフォンを差し込む - >私のオーディオのルート変更のコールバックが
  • と呼ばれ、その後、私は(私のヘッドフォンのプラグを抜くことなく、)スピーカーの音の切り替え - >オーディオルート変更コールバックがあります
  • 私はヘッドホン(音声がまだスピーカーに出力されているとき)を抜きます - >オーディオルートチェンジコールバックが呼び出されていない、これは論理的です。

しかし、ここに私の問題があります。だから私の質問は次のとおりです。この最後のケースでヘッドホンのプラグが抜かれたことを検出する方法がありますか?あなたの助けのための

おかげ

EDIT:

[OK]を、私は回避策が見つかりました:

ヘッドフォンが差し込まれているかどうか、私はテスト機能を実行し、私がする必要があるすべての時間を検出するためにそれは(ブール値を使用する代わりに)知っているが、これはパフォーマンスにはあまり効果がないかもしれないが、それを必要とする人のためのコードはここにある:

//set back the default audio route 
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

//check if this default audio route is Heaphone or Speaker 
CFStringRef newAudioRoute; 
UInt32 newAudioRouteSize = sizeof(newAudioRoute); 
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newAudioRouteSize, &newAudioRoute); 

NSString *newAudioRouteString = (__bridge NSString *)newAudioRoute; 

CFRelease(newAudioRoute); 

//if this default audio route is not Headphone, it means no headphone is plugged 
if ([newAudioRouteString rangeOfString:@"Headphones"].location != NSNotFound){ 
    NSLog(@"Earphone available"); 
    return true; 
} 
else { 
    NSLog(@"No Earphone available"); 
    return false; 
} 

誰かを助けてくれることを願っています!

+0

あなたが戻ってヘッドフォンに音を切り替えて、ヘッドフォンを抜いしようとしてみましたか? iPadはスピーカーに切り替わり、ヘッドフォンを抜くと、再び機能を呼び出す必要はなく、すでにスピーカーに設定されていると思います。 – MMMM

+0

はい私はあなたに同意しますが、私の必要性は、たとえスピーカーを使用していても、ユーザーがヘッドフォンを抜いたことを検出できることです。ブール値をfalseに設定する必要があります。ユーザーはいつも自分が望むことをしているので、すべてのケースを処理する必要があります。 – Cyril

+0

2番目のケースでは、スピーカーをオンに切り替えると、ヘッドフォンを使用してもスピーカーでサウンドを聞くことができなくてはなりません。ヘッドホンも、スピーカーだけでも使えますか? – MMMM

答えて

0

解決方法は次のようになります。 AppDelegateでスピーカーのブール値を作成します( BOOL isSpeakerOn)。また、音声ルートコールバックが呼び出されるたびに、スピーカーとの現在の状況や実行したいことを確認する必要があります。

+0

私はむしろ 'BOOL isHeadphonePlugged'のようなブール値を必要とします。私の問題は、ルートが変更されない場合、コールバックが呼び出されないことです。だから私はイベント "ヘッドフォンプラグアウト"を検出する別の方法があるかどうかを知りたい – Cyril

関連する問題