2011-08-03 10 views
3

私はこれをしばらく働かせようとしています。 私は彼らがドキュメントに書いていることをすべて実行したが、まだ何も得ていない。外部アクセサリーを3.5mmヘッドフォンジャックに接続するときに通知を受け取ることができません

これは、ローカル通知のために登録する私のアプリデリゲートのコードです:

- (void) registerForLocalNotifications { 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(_accessoryConnected:) 
              name:EAAccessoryDidConnectNotification 
              object:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(_accessoryDisconnected:) 
              name:EAAccessoryDidDisconnectNotification 
              object:nil]; 

[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; } 

以上がapplicationDidFinishLaunchingから呼び出されます。ここで

は、接続/切断方法のコードです:

- (void) _accessoryConnected:(NSNotification *)notification { 
      NSLog(@"_accessoryConnected"); } 

- (void) _accessoryDisconnected:(NSNotification*)notification { 
NSLog(@"_accessoryDisconnected"); } 


-(void) accessoryDidDisconnect:(EAAccessory *) accessory { 
NSLog(@"accessoryDidDisconnect"); } 

は私がアプリに統合する私の外部の付属品のための同じ、iPhoneに付属するヘッドホンを接続しようとしましたし、何も得ませんでした。

助けてください、 ありがとう、 Shaul。

+0

もう少し読んだ後、ヘッドホンジャックは外部付属フレームワークではサポートされていないことがわかりました。私が使用できる他のフレームワークはありますか?誰にも分かりますか? –

答えて

4

これにはAudioSessionPropertyListenerを使用する必要があります。 EAAccessory通知は、30ピンポートに接続するハードウェア用です。

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioSessionPropertyListener, nil); 

ViewDidUnLoad

でそれをのviewDidLoadでこのリスナーを追加し、削除 すると、ビューコントローラで次のメソッドを追加します。

BOOL isHeadsetPluggedIn() { 
    UInt32 routeSize = sizeof (CFStringRef); 
    CFStringRef route; 

    OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, 
               &routeSize, 
               &route 
              );  
    NSLog(@"%@", route); 
    return (!error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound)); 
} 

void audioSessionPropertyListener(void* inClientData, AudioSessionPropertyID inID, 
            UInt32 inDataSize, const void* inData) { 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 

    // Determines the reason for the route change, to ensure that it is not 
    //  because of a category change. 
    CFDictionaryRef routeChangeDictionary = inData;  
    CFNumberRef routeChangeReasonRef = CFDictionaryGetValue (routeChangeDictionary,CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); 

    SInt32 routeChangeReason;  
    CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); 

    // "Old device unavailable" indicates that a headset was unplugged, or that the 
    // device was removed from a dock connector that supports audio output. 
    if (routeChangeReason != kAudioSessionRouteChangeReason_OldDeviceUnavailable) 
     return; 

    if (!isHeadsetPluggedIn()) 
    { 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 
    } 
    else 
    { 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 
    }  
} 

私はこのコードをどこかからずっと前に取得していましたが、それは私のために働いていました。私はどこから取得したのか分からないので、現在のソースの属性にすることはできません。

+0

このCコードで管理しようとしましたが、Cに触れてから数年が経ちました。Objective-CにAVAudioSessionという代替手段があります。私はこれと同じことをすることができると思いますか? http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html#//apple_ref/doc/uid/TP40008240 –

+0

いいえ私はあなたが仕事に投稿したこのコードを入手することができましたただし、アプリが起動する前にヘッドセットがデバイスに接続されていない場合にのみ機能します。理由は何ですか? –

+0

viewDidLoadでもisHeadsetPluggedInを呼び出します。上記のコードは、音声ルート変更通知を受信した場合にのみ呼び出します。 – Mugunth

関連する問題