2010-08-26 11 views
8

Czy ktoś wie, czy można wykryć, czy słuchawki są podłączone do iPhone'a, a jeśli nie są - wyłącz dźwięk z aplikacji.Wykrywanie, czy słuchawki są podłączone do iPhone'a

Myślę, że mogłem zarządzać wyłączaniem dźwięku, ale część wykrywcza, której jeszcze nie znalazłem.

Dzięki

+0

Proszę odwiedzić ten link gdzie mam już odpowiedział .. http://stackoverflow.com/questions/667196/detecting-iphone-ipod-touch-accessories/7575623#7575623 –

Odpowiedz

4

http://developer.apple.com/iphone/library/samplecode/SpeakHere/Introduction/Intro.html

W tym projekcie znajduje się fragment kodu w którym wstrzymuje nagrywanie, jeśli słuchawki jest unpluged. Może możesz go użyć, aby osiągnąć swój wynik.

Powodzenia!

(edit)

Trzeba będzie przeanalizować plik SpeakHereController.mm.
znalazłem ten kod w metodzie

// we do not want to allow recording if input is not available 
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable); 
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error); 
btn_record.enabled = (inputAvailable) ? YES : NO; 

// we also need to listen to see if input availability changes 
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self); 
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error); 
+0

Dzięki, będę miał spójrz na to! :) –

4

Tutaj awakeFromNib jest rozwiązaniem, można go lubić lub jest to pomocne dla Ciebie.

Przed użyciem poniżej metody prosimy napisać dwóch linii również

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

(void)isHeadsetPluggedIn { 
    UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; 
    AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &routeSize, &route); 

    //NSLog(@"Error >>>>>>>>>> :%@", error); 
    /* Known values of route: 
    "Headset" 
    "Headphone" 
    "Speaker" 
    "SpeakerAndMicrophone" 
    "HeadphonesAndMicrophone" 
    "HeadsetInOut" 
    "ReceiverAndMicrophone" 
    "Lineout" */ 

    NSString* routeStr = (NSString*)route; 

    NSRange headsetRange = [routeStr rangeOfString : @"Headset"]; NSRange receiverRange = [routeStr rangeOfString : @"Receiver"]; 

    if(headsetRange.location != NSNotFound) { 
     // Don't change the route if the headset is plugged in. 
     NSLog(@"headphone is plugged in "); 
    } else 
     if (receiverRange.location != NSNotFound) { 
      // Change to play on the speaker 
      NSLog(@"play on the speaker"); 
     } else { 
      NSLog(@"Unknown audio route."); 
     } 
} 
+3

Niedawno zaktualizowana aktualizacja iOS 5 'kAudioSessionProperty_AudioRoute', użyj 'kAudioSessionProperty_AudioRouteDescription' zamiast – petershine

+0

Ten kod spowodował błąd - wierzę, ponieważ AudioSessionGetPropertySize w niewytłumaczalny sposób musiało zostać wywołane jako pierwsze. Zobacz moją odpowiedź na temat działania iOS6 poniżej (lub, miejmy nadzieję, powyżej, jeśli zostanie on przegłosowany ;-) –

+0

AudioSessionGetProperty jest teraz przestarzałe! –

6

z tym kodem można wykryć zmiany pomiędzy:

  • MicrophoneWired
  • słuchawkowe
  • LineOut
  • Głośnik

Detecting when an iOS Device connector was plugged/unplugged

Uwaga: Ponieważ iOS 5 część "audioRouteChangeListenerCallback (...)" zachowanie jest przestarzała, ale można zaktualizować go z:

// kAudioSession_AudioRouteChangeKey_PreviousRouteDescription -> Previous route 
// kAudioSession_AudioRouteChangeKey_CurrentRouteDescription -> Current route 

CFDictionaryRef newRouteRef = CFDictionaryGetValue(routeChangeDictionary, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription); 
NSDictionary *newRouteDict = (NSDictionary *)newRouteRef; 

// RouteDetailedDescription_Outputs -> Output 
// RouteDetailedDescription_Outputs -> Input 

NSArray * paths = [[newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] count] ? [newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] : [newRouteDict objectForKey: @"RouteDetailedDescription_Inputs"]; 

NSString * newRouteString = [[paths objectAtIndex: 0] objectForKey: @"RouteDetailedDescription_PortType"]; 

// newRouteString -> MicrophoneWired, Speaker, LineOut, Headphone 

Pozdrowienia

3

Aby wykonać jednorazowe sprawdzenie, czy słuchawki są podłączone (zamiast ustawiania oddzwaniania, gdy są odłączone) Znalazłem następujące działa w systemie iOS5 i nowszych wersjach:

- (BOOL) isAudioJackPlugged 
{ 

// initialise the audio session - this should only be done once - so move this line to your AppDelegate 
AudioSessionInitialize(NULL, NULL, NULL, NULL); 
UInt32 routeSize; 

// oddly, without calling this method caused an error. 
AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); 
CFDictionaryRef desc; // this is the dictionary to contain descriptions 

// make the call to get the audio description and populate the desc dictionary 
AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); 

// the dictionary contains 2 keys, for input and output. Get output array 
CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs); 

// the output array contains 1 element - a dictionary 
CFDictionaryRef dict = CFArrayGetValueAtIndex(outputs, 0); 

// get the output description from the dictionary 
CFStringRef output = CFDictionaryGetValue(dict, kAudioSession_AudioRouteKey_Type); 

/** 
These are the possible output types: 
kAudioSessionOutputRoute_LineOut 
kAudioSessionOutputRoute_Headphones 
kAudioSessionOutputRoute_BluetoothHFP 
kAudioSessionOutputRoute_BluetoothA2DP 
kAudioSessionOutputRoute_BuiltInReceiver 
kAudioSessionOutputRoute_BuiltInSpeaker 
kAudioSessionOutputRoute_USBAudio 
kAudioSessionOutputRoute_HDMI 
kAudioSessionOutputRoute_AirPlay 
*/ 

return CFStringCompare(output, kAudioSessionOutputRoute_Headphones, 0) == kCFCompareEqualTo; 
} 

Dla osób przechowujących wyniki w domu, jest to ciąg w słowniku w tablicy w słowniku.

+2

Przestarzałe w systemie iOS7 – jomafer

Powiązane problemy