如何检测iPhone是在静音模式
我正在开发一个应用程序。 在那我想通过编码检测“是否在静音模式iPhone?”。 我正在使用Objective-C的cocoa来开发它。
如果有人知道,请回复。
Pirripli的代码不起作用的原因是模拟器不支持testing,代码不检查错误。 更正后的代码如下所示:
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;
使用AudioToolBoxtesting一个NULLaudiopath是可能的:
UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; AudioSessionGetProperty ( kAudioSessionProperty_AudioRoute, &routeSize, &route ); if (route == NULL) { NSLog(@"Silent switch is on"); }
如果路由是NULL,那么没有可用的audio输出。 如果是“耳机”或“耳机”,那么静音铃声开关仍然可以打开。 但是,当它设置为“扬声器”时,它将永远不会亮起。
您可能最好在audio路由更改属性侦听器中进行以下testing:
AudioSessionAddPropertyListener ( kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self );
注意:如果你像覆盖audio路线那样做任何事情,那么这个答案可能不适用。
设置和拆除整个audio会话可能超出了这个答案的范围。
为了完整性,从Dan Bon构build这个链接 ,我实现了以下方法来解决我的应用程序中的这个问题。 有一点需要注意的是,代码首先检查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"); }
或者,显然,你可以在某种辅助类中声明它。 一个更优雅的解决scheme可能是UIApplication或其他类别的类别添加…
您可以按照以前的答案build议使用audio路由属性,但请记住: – 仅在audio类别为AmbientSound时才有效 – 不应在应用程序中多次初始化audio会话(请参阅audio会话编程指南) – 您应该释放这些CFStringRef以避免内存泄漏
如果当前audio类别不是AmbientSound,您可以考虑暂时更改它,执行Audio Route属性检查,然后恢复原始audio类别。
请注意,更改audio类别将恢复该类别的默认audio路由,给出当前的硬件configuration(即是否有耳机插入或没有等)。