Domanda

Qualcuno sa se è possibile rilevare se le cuffie sono collegate in iPhone, e se non lo sono -. Disabilitare il suono dalla vostra applicazione

Credo che avrei potuto gestire la disattivazione del suono, ma la parte di rilevamento non ho ancora trovato nulla su.

Grazie

È stato utile?

Soluzione

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 lo si può utilizzare per raggiungere il risultato.

In bocca al lupo!

(edit)

Si dovrà studiare il file SpeakHereController.mm.
Ho trovato questo codice nel metodo 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);

Altri suggerimenti

Con questo codice è possibile rilevare le modifiche tra:

  • MicrophoneWired
  • Cuffie
  • LineOut
  • Speaker

rilevare quando un connettore dispositivo iOS è stato collegato / scollegato

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

Un saluto

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

Prima di usare sotto 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.");
        }
}

Per eseguire un one-off di controllo per determinare se le cuffie sono collegate (invece di impostare una richiamata quando sono scollegati) ho trovato i seguenti lavori in iOS5 e soprattutto:

- (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 chi punteggio tenuta a casa, che è una stringa in un dizionario in un array in un dizionario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top