1

Я использую AVAudioRecorder для проверки уровня громкости и, соответственно, обновления UIImageView. Однако, когда я держу кнопку дома для Siri или когда устройство получает телефонный звонок, UIImageView больше не обновляется. Это мой текущий код с этим импортирован в .h:Обработка прерываний с помощью AVAudioRecorder

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <CoreAudio/CoreAudioTypes.h> 

Затем я использовал этот код, чтобы создать рекордер и обновить UIImageView в .m:

@interface MyViewController() 

@property NSTimer *checkDecibelLevelsTimer; 
@property (strong, nonatomic) IBOutlet UIImageView *visualizer; 
@property AVAudioRecorder *recorder; 

@end 

@implementation MyViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; 
    [audioSession setActive:YES error:nil]; 

    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 
    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
          [NSNumber numberWithInt: 1],       AVNumberOfChannelsKey, 
          [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
          nil]; 
    NSError *error; 

    self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; 

    if (self.recorder) { 
     [self.recorder prepareToRecord]; 
     self.recorder.meteringEnabled = YES; 
     [self.recorder record]; 
    } else { 
     NSLog(@"%@", [error description]); 
    } 

    self.checkDecibelLevelsTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 
                target: self 
               selector: @selector(checkDecibelLevelsCallback:) 
               userInfo: nil 
                repeats: YES]; 
} 

-(void)checkDecibelLevelsCallback:(NSTimer *)timer { 
    [self.recorder updateMeters]; 
    if ([self.recorder averagePowerForChannel:0] < -40) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer1"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -35) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer2"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -30) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer3"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -25) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer4"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -20) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer5"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -15) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer6"]; 
    } else if ([self.recorder averagePowerForChannel:0] < -10) { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer7"]; 
    } else { 
     self.visualizer.image = [UIImage imageNamed:@"Visualizer8"]; 
    } 
} 

Я пытался справиться прерывания путем реализации этого кода в .m:

- (void)beginInterruption { 
    NSLog(@"begin interruption"); 
    [self.recorder pause]; 
} 

- (void)endInterruption { 
    NSLog(@"end interruption"); 
    [self.recorder record]; 
} 

и добавление @interface MyViewController : UIViewController <AVAudioSessionDelegate> в .h. Я заметил, что NSLog ничего не возвращает и UIImageView все еще не обновляется. Как я могу это исправить?

ответ

0

Хорошо, я понял решение. Я положил это в методе viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignInactive) name:UIApplicationWillResignActiveNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 

и добавлены следующие методы:

- (void)willResignInactive { 
    [self.recorder stop]; 
} 

- (void)didBecomeActive { 
    [self.recorder record]; 
} 
Смежные вопросы