2010-04-20 1 views
6

Это мой метод:AVAudioRecorder не запишет На устройстве

-(void) playOrRecord:(UIButton *)sender { 
    if (playBool == YES) { 
     NSError *error = nil; 
     NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"]; 
     NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; 
     AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error]; 
     [player setNumberOfLoops:0]; 
     [player play];  
    } 
    else if (playBool == NO) { 
     if ([recorder isRecording]) { 
      [recorder stop]; 
      [nowRecording setImage:[UIImage imageNamed:@"NormalNormal.png"] forState:UIControlStateNormal]; 
      [nowRecording setImage:[UIImage imageNamed:@"NormalSelected.png"] forState:UIControlStateSelected]; 
     } 
     if (nowRecording == sender) { 
     nowRecording = nil; 
     return; 
     } 
     nowRecording = sender; 
     NSError *error = nil; 
     NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"]; 
     NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; 
     [sender setImage:[UIImage imageNamed:@"RecordingNormal.png"] forState:UIControlStateNormal]; 
     [sender setImage:[UIImage imageNamed:@"RecordingSelected.png"] forState:UIControlStateSelected];   
     recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:recordSettings error:&error]; 
     [recorder record]; 
    } 
} 

Большинство из них говорит само за себя; playBool - это BOOL, который является YES, когда он находится в режиме воспроизведения. Все работает в симуляторе, однако, когда я запускаю его на устройстве, запись [recorder record] возвращает NO. Кто-нибудь знает, почему это происходит?

ответ

3

Хорошо, решил мой собственный вопрос; Я не знаю почему, но мне приходится записывать в NSTemporaryDirectory, когда на устройстве. Это полностью изменило его.

+0

потому что вы не можете изменить комплект приложений !!! lol –

4

Это связано с тем, что вы не можете изменить набор приложений на устройстве (он подписан). Вы можете выполнить запись в папку документов для своего приложения или в каталог tmp.

1

У меня была такая же проблема. Оказывается, я натыкался на неверно сгенерированный оператор пути. AVAudioRecorder инициализировался отлично - и без инцидентов - но iOS просто не разрешил мне писать на него. Зачем? Проверьте это:

/* The following code will fail - why? It fails because it is trying to write some path that is NOT accessible by 
    this app. 
NSString *recordedAudioPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
           objectAtIndex:0] 
           stringByAppendingString:@"recorded.caf"]; 
*/ 
// Correction: 
NSString *recordedAudioPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
           objectAtIndex:0]; 

recordedAudioPath = [recordedAudioPath stringByAppendingPathComponent:@"recorded.caf"]; 
NSURL *recordURL = [NSURL fileURLWithPath:recordedAudioPath]; 

Это имеет смысл теперь. Спасибо, что помогли мне в правильном направлении.

+0

Они выглядят точно так же ... – Gu1234

+0

Разница в том, что компонент пути добавляется, если требуется. Это существенно добавляет/до того recorded.caf предыдущий 'неправильный' код работал бы, если бы он использовал: NSString * recordedAudioPath = [[NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0] stringByAppendingString: @ "/ recorded.caf "]; –

17

Если где-нибудь в вашем коде вы имеете эту установку:

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

изменить его на:

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

Установка неправильная категория AVAudioSession приведет к записи/воспроизведения на провал.

1

Кроме того, убедитесь, что ваше приложение имеет право доступа микрофона (т.е. в настройках IOS, прокрутите вниз и найти ваше приложение, и он должен иметь «Микрофон», который вам нужно перейти к «на»)

+0

Что? Эта проблема, которую я пытался отлаживать в течение двух дней, не может быть чем-то таким простым, конечно, у этого устройства есть разрешения на микрофон, см. ... О, вот и все. Устройство/симулятор полностью красная сельдь. iOS должен, по крайней мере, регистрировать ошибку, а не терпеть неудачу. Спасибо, иногда это так просто. –