iOS 9如何检测静音模式?

由于AudioSessionInitializeAudioSessionGetProperty被弃用,我得到错误的返回值:

 CFStringRef state = nil; UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); [[AVAudioSession sharedInstance] setActive:YES error:nil]; if (status == kAudioSessionNoError) { return CFStringGetLength(state) == 0; // YES = silent } return NO; 

从这个代码(我在这里find它),我得到同样的不正确的结果,不pipe什么状态实际上设备上。 如何检测设备上的静音模式是否开启?

该API不再可用。 但是解决方法很简单:

  • 播放一个短的audio,并检测它完成播放的时间
  • 如果完成播放的时间比audio的实际长度短,则会比设备静音

Hoishing在他的博客上发布了一个帮手类MuteChecker 。 使用它作为以下内容:

 self.muteChecker = [[MuteChecker alloc] initWithCompletionBlk:^(NSTimeInterval lapse, BOOL muted) { NSLog(@"muted: %d", muted); }]; [self.muteChecker check]; 

这是类的完整代码,你可以简单的复制过去到你的项目:

MuteChecker.h

 #import <Foundation/Foundation.h> #import <AudioToolbox/AudioToolbox.h> typedef void (^MuteCheckCompletionHandler)(NSTimeInterval lapse, BOOL muted); // this class must use with a MuteChecker.caf (a 0.2 sec mute sound) in Bundle @interface MuteChecker : NSObject -(instancetype)initWithCompletionBlk:(MuteCheckCompletionHandler)completionBlk; -(void)check; @end 

MuteChecker.cpp

 #import "MuteChecker.h" void MuteCheckCompletionProc(SystemSoundID ssID, void* clientData); @interface MuteChecker () @property (nonatomic,assign) SystemSoundID soundId; @property (strong) MuteCheckCompletionHandler completionBlk; @property (nonatomic, strong)NSDate *startTime; -(void)completed; @end void MuteCheckCompletionProc(SystemSoundID ssID, void* clientData){ MuteChecker *obj = (__bridge MuteChecker *)clientData; [obj completed]; } @implementation MuteChecker -(void)playMuteSound { self.startTime = [NSDate date]; AudioServicesPlaySystemSound(self.soundId); } -(void)completed { NSDate *now = [NSDate date]; NSTimeInterval t = [now timeIntervalSinceDate:self.startTime]; BOOL muted = (t > 0.1)? NO : YES; self.completionBlk(t, muted); } -(void)check { if (self.startTime == nil) { [self playMuteSound]; } else { NSDate *now = [NSDate date]; NSTimeInterval lastCheck = [now timeIntervalSinceDate:self.startTime]; if (lastCheck > 1) { //prevent checking interval shorter then the sound length [self playMuteSound]; } } } - (instancetype)initWithCompletionBlk:(MuteCheckCompletionHandler)completionBlk { self = [self init]; if (self) { NSURL* url = [[NSBundle mainBundle] URLForResource:@"MuteChecker" withExtension:@"caf"]; if (AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &_soundId) == kAudioServicesNoError){ AudioServicesAddSystemSoundCompletion(self.soundId, CFRunLoopGetMain(), kCFRunLoopDefaultMode, MuteCheckCompletionProc,(__bridge void *)(self)); UInt32 yes = 1; AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(_soundId),&_soundId,sizeof(yes), &yes); self.completionBlk = completionBlk; } else { NSLog(@"error setting up Sound ID"); } } return self; } - (void)dealloc { if (self.soundId != -1){ AudioServicesRemoveSystemSoundCompletion(self.soundId); AudioServicesDisposeSystemSoundID(self.soundId); } } @end 

重要提示:您还必须提供一个简短的audioMuteChecker.caf代码工作。 你可以直接从他的博客下载一个,或者自己创build一个。