2010-08-26 19 views
8

Qualcuno sa se è possibile rilevare se le cuffie sono collegate all'iPhone e, in caso contrario, disabilitare l'audio dall'applicazione.Rilevare se le cuffie sono collegate all'iPhone

Penso di riuscire a disattivare il suono, ma la parte di rilevamento su cui devo ancora trovare qualcosa.

Grazie

+0

Si prega di visitare questo link dove ho già risposto .. http://stackoverflow.com/questions/667196/detecting-iphone-ipod-touch-accessories/7575623#7575623 –

risposta

4

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

In questo progetto c'è un codice-frammento di cui si mette in pausa la registrazione se le cuffie sono UNPLUGED. Forse puoi usarlo per raggiungere il tuo risultato.

Buona fortuna!

(edit)

Si dovrà studiare il file SpeakHereController.mm.
ho trovato questo codice nel metodo di awakeFromNib

// 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

Grazie, avrò un'occhiata a quello! :) –

4

Ecco la soluzione, può piacere o è utile a voi.

Prima di utilizzare al di sotto di metodo si prega di scrivere questa due righe anche

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

L'aggiornamento iOS 5 recente deprecato 'kAudioSessionProperty_AudioRoute', usa 'kAudioSessionProperty_AudioRouteDescription' invece – petershine

+0

Questo codice ha causato un errore per me - credo perché AudioSessionGetPropertySize doveva essere chiamato per primo inesplicabilmente. Vedi la mia risposta lavorando su iOS6 di seguito (o spero di sopra se viene svitato ;-) –

+0

AudioSessionGetProperty è ora deprecato! –

6

Con questo codice è possibile rilevare le modifiche tra:

  • MicrophoneWired
  • cuffie
  • LineOut
  • Speaker

Detecting when an iOS Device connector was plugged/unplugged

Nota: Dal momento che iOS 5 parte del "audioRouteChangeListenerCallback (...)" comportamento è deprecato, ma è possibile aggiornarlo con:

// 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 

Saluti

3

per eseguire un controllo unico per determinare se le cuffie sono collegate (piuttosto che impostare una richiamata quando sono scollegate) Ho trovato i seguenti lavori in iOS5 e successivi:

- (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; 
} 

Per coloro che tengono il punteggio a casa, è una stringa in un dizionario in un array in un dizionario.

+2

Obsoleto in iOS7 – jomafer

Problemi correlati