2014-09-02 2 views
0

Я использую AVAudioSession и AVAudioRecorder для записи звука в моем приложении. К сожалению, мое приложение зависает, когда я звоню во время записи. Я попытался реализовать методы делегирования AVAudioRecorder для прерываний, но они не вызываются. У меня есть контроллер представления, с которым пользователь взаимодействует, чтобы инициировать и останавливать процесс записи и отдельный контроллер рекордера, который содержит AVAudioRecorder.Методы делегирования прерываний AVAudioRecorder не получаются вызванные

Я следующее реализован в моем самописца контроллера:

@interface OSRecordPlayController : NSObject <AVAudioRecorderDelegate, AVAudioPlayerDelegate, AVAudioSessionDelegate> 

-(void) audioRecorderBeginInterruption:(AVAudioRecorder *)recorder 
{ 
    if(recorder.recording) 
    { 
     [recorder stop]; 
     [self stopRecording]; 
     [self moveViewsDown]; 

     interruptedDuringRecording = YES; 

    } 
} 

-(void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withOptions:(NSUInteger)flags 
{ 
    if(interruptedDuringRecording) 
    { 
     [recorder prepareToRecord]; 
     [recorder record]; 
     interruptedDuringRecording = NO; 
    } 
} 

-(void)setUpAudioFile 
{ 
    self.recorder = [[AVAudioRecorder alloc] initWithURL:self.audioFileURL settings:audioSettings error:nil]; 
    self.recorder.delegate = self; 
    self.recorder.meteringEnabled = YES; 
    [self.recorder prepareToRecord]; 
} 

Почему не эти дозвонились? Я установил точку останова для обоих, но я не ударил ни одного из них. Я довольно часто видел этот вопрос без твердых ответов, все старые ответы для AVAudioSession делегируют методы прерывания, но они устарели.

+3

возможно дубликат [AVAudioPlayer и AVAudioRecorder: делегированными методы не Called] (http://stackoverflow.com/ вопросы/6579257/avaudioplayer-and-avaudiorecorder-delegate-methods-not-called) –

ответ

1

Используйте уведомления вместо делегата. Здесь он находится в Свифт.

NSNotificationCenter.defaultCenter().addObserver(self, 
     selector:"sessionInterrupted:", 
     name:AVAudioSessionInterruptionNotification, 
     object:myRecorder) 
+0

Эй, Gene, где бы вы это записали в коде? В моем контроллере рекордера? – Brosef

+1

Ваш AppDelegate будет хорошим местом. –

1

Одна вещь, которая может вызвать методы делегата не назвать, если объект AVAudioRecorder получает мусора до завершения записи. Это произойдет, если ни один другой объект не сохранит ссылку на рекордер.

Конечно, я не тупо на самом деле сделать эту ошибку, что я ... на самом деле ...

Смежные вопросы