2015-12-05 129 views
8

由於AudioSessionInitializeAudioSessionGetProperty已被取消,我得到了錯誤的返回值:iOS 9如何檢測靜音模式?

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; 

從這個代碼(我發現它here),我會得到相同的結果不正確,不管實際上是什麼狀態的裝置。如何檢測設備上的靜音模式是否開啓?

回答

5

該API不再可用。但周圍的工作很簡單:

  • 播放一小段音頻和檢測時間,它完成播放
  • 如果它完成播放的時間比音頻的實際長度短,比設備處於靜音狀態

Hoishing在他的blog上發佈了一個幫手類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 

重要注意事項:您還必須提供一個簡短的音頻MuteChecker.caf以使代碼正常工作。您可以直接從他的博客下載一個或自己創建一個。