Обнаружение, если наушники подключены к iPhone - PullRequest
9 голосов
/ 26 августа 2010

Кто-нибудь знает, можете ли вы определить, подключены ли наушники к iPhone, а если нет - отключить звук из вашего приложения.

Я думаю, что смог бы справиться с отключением звука, но в части обнаружения мне еще ничего не удалось найти.

Спасибо

Ответы [ 4 ]

6 голосов
/ 25 июня 2012

С помощью этого кода вы можете обнаружить изменения между:

  • MicrophoneWired
  • Наушники
  • LineOut
  • Динамик

Обнаружение, когда разъем устройства iOS был подключен / отключен

Примечание: Поскольку iOS 5 часть поведения "audioRouteChangeListenerCallback (...)" устарела, но вы можете обновить его с помощью:

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

Привет

4 голосов
/ 07 августа 2013

Чтобы выполнить однократную проверку, чтобы определить, подключены ли наушники (вместо установки обратного вызова, когда они отключены), я обнаружил следующие работы в iOS5 и выше:

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

Для тех,хранить счет дома, это строка в словаре в массиве в словаре.

4 голосов
/ 28 сентября 2011

Вот решение, оно может вам понравиться или оно вам пригодится.

Перед использованием нижеприведенного метода, пожалуйста, напишите эти две строки также

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.");
        }
}
4 голосов
/ 26 августа 2010

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

В этом проекте есть фрагмент кода, где он приостанавливает запись, если наушники не подключены. Может быть, вы можете использовать его для достижения своего результата.

Удачи!

(редактировать)

Вам нужно будет изучить файл SpeakHereController.mm.
Я нашел этот код в 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);
...