如何检测iphone处于静音模式

时间:2009-05-07 07:20:26

标签: ios objective-c iphone cocoa-touch audio

我正在开发一个应用程序。因为我想通过编码检测“iPhone是否处于静音模式?”。我正在使用Objective-C的可可开发它。

如果有人知道,请回复。

4 个答案:

答案 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,您可以考虑暂时更改它,执行音频路由属性检查,然后恢复原始音频类别。

请注意,根据当前的硬件配置(即是否插入耳机等),更改音频类别将恢复该类别的默认音频路由。