Обнаружение аксессуаров iPhone /iPod Touch
-
21-08-2019 - |
Вопрос
Можно ли определить, подключены ли к iPod Touch / iPhone какие-либо наушники или другие аксессуары?
Я создаю приложение, для которого требуется микрофон, и мне нужно знать, подключен ли он к "ISomething" или нет, либо через док-станцию, либо через порт для наушников, например, с помощью встроенного аксессуара для наушников / микрофона от Apple.
Решение
Наконец-то нашел это - После инициализации объекта Audio Session, - AudioSessionInitialize() - вы можете выполнить вызов AudioSessionGetProperty и получить значение kAudioSessionProperty_AudioInputAvailable.
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 propertySize, micConnected;
AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &propertySize, &micConnected);
[self updateMicStatus:micConnected]; // user-created method
Согласно документации для служб аудиосессий, это следует использовать, а не использовать модель устройства (iPhone противiPod Touch), чтобы определить, доступен ли аудиовход для использования.Вы также можете настроить функцию обратного вызова для отслеживания изменений этого свойства с помощью AudioSessionAddPropertyListener().
Пока не уверен, применимо ли это свойство также к устройствам, подключенным через разъем док-станции, но, похоже, оно работает для разъема для наушников.
Другие советы
Или вы могли бы использовать:
if (![[AVAudioSession sharedInstance] inputIsAvailable]) {
// your code here for no audio input available
}
В IOS 6 inputIsAvailable
является устаревший.В будущем нам нужно использовать inputAvailable
:
BOOL audioHWAvailable = audioSession.inputAvailable;
Чтобы определить, есть ли в устройстве встроенный микрофон, вы можете просто пройти мимо [UIDevice currentDevice].model
чтобы узнать, iPhone это или iPod Touch 2-го поколения.Что касается микрофона стороннего производителя, подключенного к разъему док-станции, это невозможно в текущем пакете 2.2.1 SDK, но это может быть в более поздней версии :)
Вот решение, оно может вам понравиться или быть полезным для вас.
Перед использованием приведенного ниже метода, пожалуйста, напишите также эти две строки
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.");
}
}