如何以编程方式感应iPhone静音开关?

我似乎无法在SDK中find如何以编程方式感知iPhone上的静音button/开关。 当我的应用程序播放背景音乐,它响应音量button没有我有任何代码,但是,当我使用静音开关,它只是继续玩。

我如何testing静音的位置?

(注意:我的程序有自己的静音开关,但是我希望物理开关覆盖它。)

谢谢!

谢谢,JPM。 事实上,你提供的链接导致了正确的答案(最终;)为了完整性(因为SO应该是QUICK答案的来源!)…

// "Ambient" makes it respect the mute switch // Must call this once to init session if (!gAudioSessionInited) { AudioSessionInterruptionListener inInterruptionListener = NULL; OSStatus error; if ((error = AudioSessionInitialize (NULL, NULL, inInterruptionListener, NULL))) { NSLog(@"*** Error *** error in AudioSessionInitialize: %d.", error); } else { gAudioSessionInited = YES; } } SInt32 ambient = kAudioSessionCategory_AmbientSound; if (AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (ambient), &ambient)) { NSLog(@"*** Error *** could not set Session property to ambient."); } 

我在这里回答了一个类似的问题(链接) 。 相关代码:

  -(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; } 

其他答案(包括接受的答案)中的一些代码可能无法正常工作,如果您不处于环境模式,其中遵守静音开关。

我写下例程切换到环境,阅读开关,然后返回到我的应用程序需要的设置。

 -(BOOL)muteSwitchEnabled { #if TARGET_IPHONE_SIMULATOR // set to NO in simulator. Code causes crashes for some reason. return NO; #endif // go back to Ambient to detect the switch AVAudioSession* sharedSession = [AVAudioSession sharedInstance]; [sharedSession setCategory:AVAudioSessionCategoryAmbient error:nil]; CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); BOOL muteSwitch = (CFStringGetLength(state) <= 0); NSLog(@"Mute switch: %d",muteSwitch); // code below here is just restoring my own audio state, YMMV _hasMicrophone = [sharedSession inputIsAvailable]; NSError* setCategoryError = nil; if (_hasMicrophone) { [sharedSession setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryError]; // By default PlayAndRecord plays out over the internal speaker. We want the external speakers, thanks. UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (ASRoute), &ASRoute ); } else // Devices with no mike don't support PlayAndRecord - we don't get playback, so use just playback as we don't have a microphone anyway [sharedSession setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; if (setCategoryError) NSLog(@"Error setting audio category! %@", setCategoryError); return muteSwitch; } 

OLIE,

我相信你可以在这里find你的问题的答案:

https://devforums.apple.com/message/1135#1135

我假设你有权访问Apple.com上的开发者论坛:)

要了解静音开关的状态音量控制,我写了这两个函数。 如果您希望在尝试创buildaudio输出之前警告用户,这些都是理想之选。

 -(NSString*)audioRoute { CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); if( n ) { // TODO: Throw an exception NSLog( @"AudioSessionGetProperty: %@", osString( n ) ); } NSString *result = (NSString*)state; [result autorelease]; return result; } -(Float32)audioVolume { Float32 state; UInt32 propertySize = sizeof(CFStringRef); OSStatus n = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume, &propertySize, &state); if( n ) { // TODO: Throw an exception NSLog( @"AudioSessionGetProperty: %@", osString( n ) ); } return state; } 
 -(BOOL)isDeviceMuted { CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); return (CFStringGetLength(state) > 0 ? NO : YES); } 

我遵循这里的一般理论,并得到这个工作http://inforceapps.wordpress.com/2009/07/08/detect-mute-switch-state-on-iphone/

这里是一个概述:播放一个短暂的无声的声音。 时间需要多长时间才能播放。 如果静音开关打开,则声音的播放将比声音本身短得多。 我用了500ms的声音,如果声音低于这个时间,那么静音开关就打开了。 我使用audio服务播放沉默的声音(始终尊重静音开关)。 这篇文章说,你可以使用AVAudioPlayer播放这个声音。 如果您使用AVAudioPlayer,我假设您将需要设置您的AVAudioSession的类别来兑现静音开关,但我没有尝试过。

这里有两个例子如何使用AudioSessionInitialize: http : //www.restoroot.com/Blog/2008/12/25/audiosessioninitialize-workarounds/

使用Ambient(环境)模式播放video,使用PlayAndRecord (播放和录制)模式在相机屏幕上录制video,解决了我们的问题。

应用程序中的代码:didFinishLaunchingWithOptions:

 NSError *error = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&error]; [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:&error]; [[AVAudioSession sharedInstance] setActive:YES error:&error]; 

viewWillAppear在cameraController,如果你必须使用相机或录音在您的应用程序中的代码

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

viewWill中的代码在cameraController上显示

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; 

使用这些线我们的应用程序logging和播放video和静音开关完美工作在iOS8和iOS7下!