Ios 如何检测iphone处于静默模式
我正在开发一个应用程序。我想通过编码检测“iPhone是否处于静默模式?”。我正在用Objective-C开发cocoaIos 如何检测iphone处于静默模式,ios,objective-c,iphone,cocoa-touch,audio,Ios,Objective C,Iphone,Cocoa Touch,Audio,我正在开发一个应用程序。我想通过编码检测“iPhone是否处于静默模式?”。我正在用Objective-C开发cocoa 如果有人知道,请回复。可以使用AudioToolBox测试空音频路由: UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; AudioSessionGetProperty ( kAudioSessionProperty_AudioRoute,
如果有人知道,请回复。可以使用AudioToolBox测试空音频路由:
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
AudioSessionGetProperty (
kAudioSessionProperty_AudioRoute,
&routeSize,
&route
);
if (route == NULL) {
NSLog(@"Silent switch is on");
}
如果路由为空,则没有可用的音频输出。如果是“耳机”或“耳机”,则静音铃声开关可能仍处于打开状态。但是,当它设置为“扬声器”时,它将永远不会打开
您最好在音频路由更改属性侦听器中对此进行测试,设置如下:
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self
);
注意:如果你正在做一些令人毛骨悚然的事情,比如覆盖音频路由,那么这个答案可能不适用
完整地设置和拆除音频会话可能超出了本回答的范围。为了完整性,从Dan Bon开始,我在我的应用程序中实现以下方法来解决此问题。需要注意的一点是,代码首先检查iPhone模拟器——执行以下代码将使模拟器崩溃。有人知道为什么吗
-(BOOL)silenced {
#if TARGET_IPHONE_SIMULATOR
// return NO in simulator. Code causes crashes for some reason.
return NO;
#endif
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if(CFStringGetLength(state) > 0)
return NO;
else
return YES;
}
在视图控制器中声明此权限,只需检查
if ([self silenced]) {
NSLog(@"silenced");
else {
NSLog(@"not silenced");
}
或者,很明显,您可以在某种助手类中声明它。更优雅的解决方案可能是在UIApplication或其他类似类上添加类别 Pirripli的代码不起作用的原因是模拟器不支持测试,并且代码没有检查错误。更正后的代码如下所示:
CFStringRef state = nil;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if (status == kAudioSessionNoError)
{
return (CFStringGetLength(state) == 0); // YES = silent
}
return NO;
您可以按照前面的答案使用音频路由属性,但请记住: -仅当音频类别为AmbientSound时,它才起作用 -您不应在应用程序中多次初始化音频会话(请参阅《音频会话编程指南》) -您应该释放这些CFStringRef以避免mem泄漏 如果当前音频类别不是AmbientSound,您可以考虑暂时更改它,执行音频路由属性检查,然后恢复原始音频类别
请注意,根据当前的硬件配置(即是否插入耳机等),更改音频类别将恢复该类别的默认音频路由。非常感谢coob。我会检查一下并让你知道。它不起作用AudioSessionAddPropertyListener在ios-7中也被弃用在iPhone 4 ios 5上不起作用:(…state=“speaker”,i thinkCorrect,不适用于iOS 5,事实证明苹果从未打算以这种方式使用它。我的应用程序不再尝试查找静音开关的状态。该应用程序输出音频,如果用户打开了静音开关,则音频不会发出声音。该应用程序还优先选择振动,如果用户打开了静音开关n应用程序除音频外还会振动。因此用户可以完全控制,应用程序不需要知道开关的状态。@尼尔,你说你的应用程序“不再试图找出静音开关的状态”,但“如果用户打开了静音开关,则音频不会响”。这是否意味着您正在监视静音开关?您使用的是哪个类别?@ari gold,我不监视静音开关。如果用户打开了静音开关,则不会出现声音,如果关闭了静音开关,则我的应用程序不关心。AudioSessionGetProperty现在已弃用。存在[AVAudioSession sharedInstance].currentRoute以获取currentRoute,但即使使用AvaudioSessionCategoryByent也不允许获取硬件静默开关的状态。