Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检测iphone处于静默模式_Ios_Objective C_Iphone_Cocoa Touch_Audio - Fatal编程技术网

Ios 如何检测iphone处于静默模式

Ios 如何检测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,

我正在开发一个应用程序。我想通过编码检测“iPhone是否处于静默模式?”。我正在用Objective-C开发cocoa


如果有人知道,请回复。

可以使用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也不允许获取硬件静默开关的状态。