【问题标题】:headphone plug-in plug-out event when audio route doesn't change - iOS音频路由未更改时的耳机插件插入事件 - iOS
【发布时间】:2012-05-12 17:22:07
【问题描述】:

我正在使用 iPad。 我想检测用户何时拔出耳机。首先,我在属性kAudioSessionProperty_AudioRouteChange 上使用了一个侦听器。所以一切都运作良好,直到我决定添加一个按钮以在耳机仍插入时切换到扬声器。所以我现在面临一个问题,也许有人会有解决它的想法。

这是场景:

  • 我插入耳机 -> 我的音频路由更改回调被调用
  • 然后我将声音切换到扬声器(无需拔下耳机)-> 调用音频路由更改回调
  • 然后我拔下耳机(当声音仍在输出到扬声器时)-> 不调用音频路由更改回调,这似乎合乎逻辑。

但这是我的问题!所以我的问题是:你有没有办法检测到最后一种情况下耳机被拔掉了?

感谢您的帮助

编辑:

好的,我找到了解决方法:

为了检测是否插入了耳机,我在需要知道它的所有时候都执行一个测试函数(而不是使用布尔值),这可能对性能不太好,但它可以工作,这是我的代码谁可能需要它:

//set back the default audio route
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

//check if this default audio route is Heaphone or Speaker
CFStringRef newAudioRoute;
UInt32 newAudioRouteSize = sizeof(newAudioRoute);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newAudioRouteSize, &newAudioRoute);

NSString *newAudioRouteString = (__bridge NSString *)newAudioRoute;

CFRelease(newAudioRoute);

//if this default audio route is not Headphone, it means no headphone is plugged
if ([newAudioRouteString rangeOfString:@"Headphones"].location != NSNotFound){
    NSLog(@"Earphone available");
    return true;
}
else {
    NSLog(@"No Earphone available");
    return false;
}

希望它会帮助别人!

【问题讨论】:

  • 您是否尝试将声音切换回耳机,然后尝试拔下耳机?我想,iPad是切换到扬声器的,当你拔掉耳机时,它会认为,不需要再次调用该功能,它已经设置在扬声器上。
  • 是的,我同意你的观点,但我需要能够检测到用户拔掉了耳机,即使使用了扬声器。我需要这个来将布尔值设置为 false。因为用户总是做他想做的事,所以我必须处理所有情况......
  • 第二种情况,当您打开扬声器时,即使使用耳机,您也必须能够听到扬声器和耳机上的声音,还是只能在扬声器上听到声音?跨度>

标签: objective-c ios audiosession headphones


【解决方案1】:
【解决方案2】:

我想通过以下方式解决它: 您在 AppDelegate 中为扬声器创建一个布尔值,假设: BOOL isSpeakerOn。并且每次调用音频路由回调时,您都必须验证扬声器的当前情况以及您想要做什么。

【讨论】:

  • 我宁愿需要像 BOOL isHeadphonePlugged 这样的布尔值。我的问题是,如果路由没有改变,则不会调用回调。所以我想知道是否有另一种方法来检测“耳机拔出”事件
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 2016-01-30
  • 2013-05-27
  • 1970-01-01
  • 2023-04-08
  • 2015-12-17
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多