我正在开发一个应用程序。因为我想通过编码检测“iPhone是否处于静音模式?”。我正在使用Objective-C的可可开发它。
如果有人知道,请回复。
答案 0 :(得分:19)
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;
答案 1 :(得分:4)
可以通过使用AudioToolBox测试NULL音频路径:
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
AudioSessionGetProperty (
kAudioSessionProperty_AudioRoute,
&routeSize,
&route
);
if (route == NULL) {
NSLog(@"Silent switch is on");
}
如果route为NULL,则没有可用的音频输出。如果它是“耳机”或“耳机”,那么静音振铃开关仍然可以打开。但是,当它被设置为“扬声器”时它永远不会打开。
您可能最好在音频路由更改属性侦听器中对此进行测试,如下所示:
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self
);
注意:如果您正在做任何类似于覆盖音频路线的时髦,那么这个答案可能不适用。
完整地设置和拆除音频会话可能超出了这个答案的范围。
答案 2 :(得分:3)
为了完整性,从Dan Bon建立this link,我实现了以下方法来解决我的应用中的这个问题。需要注意的一点是代码首先检查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上的类别添加或某些其他类......
答案 3 :(得分:1)
您可以按照之前的答案建议使用音频路由属性,但请记住: - 仅当音频类别为AmbientSound时才有效 - 您不应在应用程序中多次初始化音频会话(请参阅音频会话编程指南) - 你应该释放那些CFStringRef以避免内存泄漏
如果当前音频类别不是AmbientSound,您可以考虑暂时更改它,执行音频路由属性检查,然后恢复原始音频类别。
请注意,根据当前的硬件配置(即是否插入耳机等),更改音频类别将恢复该类别的默认音频路由。