Обнаружение iPhone/iPod Touch Аксессуары
Можно ли определить, подключены ли к iPod Touch/iPhone какие-либо наушники или другие аксессуары?
Я создаю приложение, для которого требуется микрофон, и мне нужно знать, подключен ли "iSomething" к нему или нет, либо через док-станцию, либо через порт для наушников, например, с помощью встроенного аксессуара для наушников / микрофона от Apple.
5 ответов
Наконец нашел его - После инициализации объекта 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
Согласно документам для Audio Session Services, это следует использовать, а не использовать модель устройства (iPhone против iPod Touch), чтобы определить, доступен ли аудиовход для использования. Вы также можете настроить функцию обратного вызова для отслеживания изменений этого свойства с помощью AudioSessionAddPropertyListener().
Еще не уверен, относится ли это свойство также к устройствам, подключенным через разъем док-станции, но похоже, что оно работает для разъема для наушников.
В IOS 6 inputIsAvailable
устарела. В будущем нам нужно использовать inputAvailable
:
BOOL audioHWAvailable = audioSession.inputAvailable;
Или вы можете использовать:
if (![[AVAudioSession sharedInstance] inputIsAvailable]) {
// your code here for no audio input available
}
Чтобы определить, имеет ли устройство встроенный микрофон, вы можете просто [UIDevice currentDevice].model
чтобы узнать, iPhone это или iPod Touch второго поколения. Поскольку сторонний микрофон подключен к разъему док-станции, это невозможно в текущем 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.");
}
}